node.jstypescripteslinttypeormexpress-router

TypeScript/Eslint throwing a 'Promise returned' error on a Express Router async route


I have the following endpoint setup to reset a database after test runs:

import { getConnection } from 'typeorm';
import express from 'express';
const router = express.Router();

const resetDatabase = async (): Promise<void> => {
  const connection = getConnection();
  await connection.dropDatabase();
  await connection.synchronize();
};

// typescript-eslint throws an error in the following route:
router.post('/reset', async (_request, response) => {
  await resetTestDatabase();
  response.status(204).end();
});

export default router;

The entire route since async is underlined with a typescript-eslint error Promise returned in function argument where a void return was expected.

The app works perfectly but I'm not sure if I should be doing a safer implementation or just ignoring/disabling Eslint for this one. Any idea of what's wrong with that code?


Solution

  • It seems you are using the no-misused-promises rule which states that you cannot return Promise<void> in a place where void is expected.

    This means that you cannot return Promise<void> from your Express handler because the return type of RequestHandler from the library specifies that the return type should be void. I would suggest that you change it to return Promise<Response> by adding a simple return keyword:

    import { getConnection } from 'typeorm';
    import express from 'express';
    const router = express.Router();
    
    const resetDatabase = async (): Promise<void> => {
      const connection = getConnection();
      await connection.dropDatabase();
      await connection.synchronize();
    };
    
    // typescript-eslint throws an error in the following route:
    router.post('/reset', async (_request, response) => {
      await resetTestDatabase();
      return response.status(204).send();  // <----- return added here
    });
    
    export default router;
    

    The other option would be to avoid using async/await:

    router.post('/reset', (_request, response) => {
      resetDatabase().then(() => response.status(204).send());
    });