Search code examples
nestfastify

Fastify reply was can not be sent


export class SessionController {
  constructor(private sessionService: SessionService) {}

  @Post('login')
  async login(
    @Req() req: FastifyRequest,
    @Body() params: LoginDto,
    @Res() reply: FastifyReply,
  ) {
    params.ipAddress = req.socket.remoteAddress; /* ::1 */
    this.sessionService
      .signin(params)
      .then((user) => {
        reply.header('Authorization', `Bearer ${user.access_token}`);
        reply.code(201).send(user);
      })
      .catch((error) => {
        console.log(error instanceof HttpException);
        reply.status(error.status).send({ errors: [error.message] });
      });
  }
}

When I hit this API, I received an error which was reply was already sent, Here I did not use the reply.sent() function two times, In this nest js application I have used the frame framework under the hood, If I run this same function with express it works fine.

{"level":40,"time":1663844608468,"pid":5951,"hostname":"yavar","reqId":"req-1","err":{"type":"FastifyError","message":"Reply was already sent.","stack":"FastifyError: Reply was already sent.\n at Reply.send (/home/bennison/Documents/project/nest-lib/node_modules/fastify/lib/reply.js:118:26)\n at /home/bennison/Documents/project/nest-lib/src/user/user.controller.ts:35:15\n at processTicksAndRejections (node:internal/process/task_queues:96:5)","name":"FastifyError","code":"FST_ERR_REP_ALREADY_SENT","statusCode":500},"msg":"Reply already sent"}

If I use the async and await method instead of then catch it works fine. If anyone knows the answer, please explain to me what mistake have I made here.


Solution

  • To fix that issue, we need to call the method in the return statement. here call the sessionService in the return statement.

    export class SessionController {
      constructor(private sessionService: SessionService) {}
    
      @Post('login')
      async login(
        @Req() req: FastifyRequest,
        @Body() params: LoginDto,
        @Res() reply: FastifyReply,
      ) {
        params.ipAddress = req.socket.remoteAddress; /* ::1 */
       return this.sessionService
          .signin(params)
          .then((user) => {
            reply.header('Authorization', `Bearer ${user.access_token}`);
            reply.code(201).send(user);
          })
          .catch((error) => {
            console.log(error instanceof HttpException);
            reply.status(error.status).send({ errors: [error.message] });
          });
      }
    }