#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 в экспресс-маршрутизаторе по умолчанию.