Экспресс-маршрутизатор узла Typescript и второй аргумент. Typescript-eslint / обещания не используются неправильно

#node.js #typescript #express

#node.js #машинописный текст #экспресс

Вопрос:

Что мне делать с функцией регистрации, чтобы исправить @typescript-eslint/no-misused-promises. Единственный способ, которым я нашел, как решить эту проблему, — это написать eslint.

 "@typescript-eslint/no-misused-promises": [
  "error",
  {
    "checksVoidReturn": false
  }
]
 

Но я бы хотел решить эту проблему так, как того требует eslint. Есть идеи?

 import PromiseRouter from "express-promise-router";
import { login, registration } from './authController';

const router = PromiseRouter();


> ESLint: Promise returned in function argument where a void return was
> expected.(@typescript-eslint/no-misused-promises)

router.post('/registration', registration);
 

Вот полная функция регистрации

 export async function registration(req: TreqBodyReg, res: Response): Promise<void> {
  try {
    const { email, password } = req.body;
    const candidate = await ModelUser.findOne({ email }) as TuserFromDB;
    if (candidate) {
      res.status(400).json({ message: `There is user with email ${email}` });
      return;
    }
    const hashPassword = bcrypt.hashSync(password, 7);
    const user = new ModelUser({ email, password: hashPassword });
    await user.save();
    res.status(200).json({ message: `The user by email ${email} was successfully registered` });
  } catch (err: unknown) {
    res.status(400).json({ message: err });
  }
};
 

Комментарии:

1. Вам удалось решить эту проблему?

2. не в течение некоторого времени(

Ответ №1:

Это окольный путь, но я решил проблему таким образом.

 async function registerUser(req: TreqBodyReg, res: Response): Promise<void> {
  const { email, password } = req.body;
  const candidate = await ModelUser.findOne({ email }) as TuserFromDB;
  if (candidate) {
    res.status(400).json({ message: `There is user with email ${email}` });
    return;
  }
  const hashPassword = bcrypt.hashSync(password, 7);
  const user = new ModelUser({ email, password: hashPassword });
  await user.save();
  res.status(200).json({ message: `The user by email ${email} was successfully registered` });
}

export function registration(req: TreqBodyReg, res: Response): void {
  registerUser(req, res).catch((err: unknown) => {
    res.status(400).json({ message: err });
  });
}
 

Ответ №2:

Я столкнулся с той же проблемой, используя значение по умолчанию Router , и решил ее, выполнив это:

 router.get("/", function(request: Request, response: Response): void {
  void (async function(): Promise<void> {
    // do your asychronous work here
    response.json(/* put your payload here */);
  })();
});
 

Я признаю, что мне не нравится дополнительный шаблон, но это лучший ответ, который я нашел до сих пор.

(async function(): Promise<void> {...})(); Часть представляет собой просто асинхронную самозапускающуюся функцию (обратите внимание на дополнительное () в конце). void Перед ним отбрасывается возвращаемый тип, чтобы ESLint знал, что вы действительно намерены игнорировать возвращенное обещание. Без этого вы получите ошибку «no-floating-promises». Конечно, это означает, что вы берете на себя ответственность за try-catch внутреннее использование для устранения ошибок…

Итак, конечным результатом такого подхода является то, что дополнительный шаблон позволяет использовать async / await в экспресс-маршрутизаторе по умолчанию.