I really need help regarding this problem since I haven’t found a solution yet. I’m trying to deploy my nodejs app on Heroku. The login endpoint works fine but all others endpoints return a 404 error
The log error
2019-10-28T15:48:14.987114+00:00 heroku[router]: sock=backend at=error code=H18 desc="Server Request Interrupted" method=GET path="/todos" host=apipracticecoding.herokuapp.com request_id=38515e4f-490e-4bc9-99ef-7d80280aeec5 fwd="41.234.192.84" dyno=web.1 connect=1ms service=18ms status=503 bytes= protocol=https
2019-10-28T15:48:14.986317+00:00 app[web.1]: [2019-10-28T15:48:14.972] [INFO ] [TSED] - { reqId: '4',
2019-10-28T15:48:14.98634+00:00 app[web.1]: method: 'GET',
2019-10-28T15:48:14.986342+00:00 app[web.1]: url: '/todos',
2019-10-28T15:48:14.986344+00:00 app[web.1]: duration: 0,
2019-10-28T15:48:14.986347+00:00 app[web.1]: time: 2019-10-28T15:48:14.972Z,
2019-10-28T15:48:14.986349+00:00 app[web.1]: event: 'request.start' }
2019-10-28T15:48:14.986699+00:00 app[web.1]: [2019-10-28T15:48:14.980] [ERROR] [TSED] - { method: 'GET',
2019-10-28T15:48:14.986702+00:00 app[web.1]: url: '/todos',
2019-10-28T15:48:14.986705+00:00 app[web.1]: headers:
2019-10-28T15:48:14.986707+00:00 app[web.1]: { host: 'apipracticecoding.herokuapp.com',
2019-10-28T15:48:14.986709+00:00 app[web.1]: connection: 'close',
2019-10-28T15:48:14.986711+00:00 app[web.1]: 'cache-control': 'no-cache',
2019-10-28T15:48:14.986714+00:00 app[web.1]: 'postman-token': 'cb8242f3-3b03-4bdc-87b7-f834d428bdc6',
2019-10-28T15:48:14.986719+00:00 app[web.1]: authorization: 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1ZDc2YWUxZTcxMjVkMTM0NjU1MDQ1ZWEiLCJlbWFpbCI6InphY2hhcmllbnppdWtpNDRAZ21haWwuY29tIiwiYWRtaW4iOmZhbHNlLCJpYXQiOjE1NzIxNjk5MjgsImV4cCI6MTU3NDc2MTkyOH0.Pj7-pIbVgU55nvt8MGJY5VqEjXakTfeUjpoZx4QmaoY',
2019-10-28T15:48:14.986721+00:00 app[web.1]: 'user-agent': 'PostmanRuntime/7.2.0',
2019-10-28T15:48:14.986723+00:00 app[web.1]: accept: '*/*',
2019-10-28T15:48:14.986726+00:00 app[web.1]: cookie: 'connect.sid=s%3A5tj0IDsjuZXKsV0Y-g6bqy8O_Hx8QHcj.QvqlLmDoslJQ%2BrcA6IFI89RR02neWilfEuVt0%2FtzSBQ',
2019-10-28T15:48:14.986727+00:00 app[web.1]: 'accept-encoding': 'gzip, deflate',
2019-10-28T15:48:14.98673+00:00 app[web.1]: 'x-request-id': '38515e4f-490e-4bc9-99ef-7d80280aeec5',
2019-10-28T15:48:14.986732+00:00 app[web.1]: 'x-forwarded-for': '41.234.192.84',
2019-10-28T15:48:14.986735+00:00 app[web.1]: 'x-forwarded-proto': 'https',
2019-10-28T15:48:14.986737+00:00 app[web.1]: 'x-forwarded-port': '443',
2019-10-28T15:48:14.986739+00:00 app[web.1]: via: '1.1 vegur',
2019-10-28T15:48:14.986741+00:00 app[web.1]: 'connect-time': '1',
2019-10-28T15:48:14.986743+00:00 app[web.1]: 'x-request-start': '1572277694967',
2019-10-28T15:48:14.986744+00:00 app[web.1]: 'total-route-time': '0' },
2019-10-28T15:48:14.986746+00:00 app[web.1]: body: undefined,
2019-10-28T15:48:14.986748+00:00 app[web.1]: query: {},
2019-10-28T15:48:14.98675+00:00 app[web.1]: params: {},
2019-10-28T15:48:14.986752+00:00 app[web.1]: reqId: '4',
2019-10-28T15:48:14.986754+00:00 app[web.1]: time: 2019-10-28T15:48:14.980Z,
2019-10-28T15:48:14.986756+00:00 app[web.1]: duration: 8,
2019-10-28T15:48:14.986758+00:00 app[web.1]: error:
2019-10-28T15:48:14.986761+00:00 app[web.1]: { message: 'ENOENT: no such file or directory, stat \'/app/dist/client/build/index.js\'',
2019-10-28T15:48:14.986764+00:00 app[web.1]: stack: 'Error: ENOENT: no such file or directory, stat \'/app/dist/client/build/index.js\'',
2019-10-28T15:48:14.986766+00:00 app[web.1]: status: 404,
2019-10-28T15:48:14.986768+00:00 app[web.1]: origin: undefined } }
2019-10-28T15:48:14.986894+00:00 app[web.1]: [2019-10-28T15:48:14.985] [INFO ] [TSED] - { reqId: '4',
2019-10-28T15:48:14.986897+00:00 app[web.1]: method: 'GET',
2019-10-28T15:48:14.986899+00:00 app[web.1]: url: '/todos',
2019-10-28T15:48:14.986901+00:00 app[web.1]: duration: 13,
2019-10-28T15:48:14.986903+00:00 app[web.1]: time: 2019-10-28T15:48:14.985Z,
2019-10-28T15:48:14.986905+00:00 app[web.1]: event: 'request.end',
2019-10-28T15:48:14.986907+00:00 app[web.1]: status: 404 }
2019-10-28T15:48:14.987442+00:00 app[web.1]: GET /todos 404 12.216 ms - 144
My login endpoint which works fine
/**
* Authenticate user with local info (in Database).
* @param email
* @param password
* @param request
* @param response
*/
@Post("/login")
@Summary("Log in user with email and password")
async login(@Required() @BodyParams("email") email: string,
@Required() @BodyParams("password") password: string,
@Req() request: Express.Request,
@Res() response: Express.Response) {
return new Promise<Users>((resolve, reject) => {
Passport.authenticate("login", (err, res: InsightResponse) => {
if (err) {
res = err;
response.status(res.code);
response.setHeader("Content-Type", "application/json");
response.json({
success: false,
status: "Login Unsuccessfull!",
err: res.body.name
});
reject(err);
}
else {
console.log("RESULT: ", res);
const user: any = res.body;
if (res && user.name) {
response.status(res.code);
response.setHeader("Content-Type", "application/json");
response.json({
success: false,
status: "Login Unsuccessfull!",
err: user.name
});
reject(!!err);
}
else if (res && user.result) {
request.login(user.result, { session: false }, (err) => {
if (err) {
response.status(API_ERRORS.UNAUTHORIZED.status);
response.setHeader("Content-Type", "application/json");
response.json({
success: false,
status: "Login Unsuccessfull!",
err: err
});
reject(err);
}
let token = PassportService.getToken(user.result);
response.status(HTTPStatusCodes.OK);
response.setHeader("Content-Type", "application/json");
response.json({
success: true,
status: "Login Successfull!",
token: token,
user: request.user
});
resolve(user.result);
});
}
}
})(request, response, () => {});
});
}
My other endpoint todos for example
@Controller("/todos")
export class TodosCtrl {
constructor(private todos: TodosService) {}
@Get("/")
@Summary("Get all todos")
@Authenticated()
get(@Req() request: Express.Request, @Res() response: Express.Response): Promise<any> {
return new Promise<any>(async (resolve, reject) => {
let res: InsightResponse;
try {
res = await this.todos.get(request.user._id);
response.status(res.code);
response.setHeader('Content-Type', 'application/json');
response.json(res.body.result);
resolve(res.body.result);
} catch (err) {
res = err;
response.status(res.code);
response.setHeader("Content-Type", "application/json");
response.json(res.body.name);
reject(res.body.name);
}
});
}
@Post("/")
@Summary("Add a todo")
@Authenticated()
post(@Req() request: Express.Request,
@Res() response: Express.Response,
@BodyParams("problemID") problemID: string): Promise<any> {
return new Promise<any>(async (resolve, reject) => {
let res: InsightResponse;
try {
res = await this.todos.add(problemID, request.user._id);
response.status(res.code);
response.setHeader('Content-Type', 'application/json');
response.json(res.body.result);
resolve(res.body.result);
} catch (err) {
res = err;
response.status(res.code);
response.setHeader("Content-Type", "application/json");
response.json(res.body.name);
reject(res.body.name);
}
});
}
@Delete("/")
@Summary("Delete a todo")
@Authenticated()
delete(@Req() request: Express.Request,
@Res() response: Express.Response,
@QueryParams("problemID") problemID: string): Promise<any> {
return new Promise<any>(async (resolve, reject) => {
let res: InsightResponse;
try {
res = await this.todos.remove(problemID, request.user._id);
response.status(res.code);
response.setHeader('Content-Type', 'application/json');
response.json(res.body.result);
resolve(res.body.result);
} catch (err) {
res = err;
response.status(res.code);
response.setHeader("Content-Type", "application/json");
response.json(res.body.name);
reject(res.body.name);
}
});
}
}
Please help me to solve this issue since it is a part of my project I must deliver