¿Qué debo hacer con la función de registro para arreglar @typescript-eslint/no-misused-promises . La única forma en que encontré cómo solucionar este problema es escribir por eslint.
"@typescript-eslint/no-misused-promises": [ "error", { "checksVoidReturn": false } ]Pero me gustaría resolver este problema como lo requiere eslint. ¿Algunas ideas?
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);Aquí está la función completa de registro.
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 }); } };Es indirecto, pero resolví el problema de esta manera.
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 }); }); }Encontré el mismo problema usando el Router predeterminado y lo resolví haciendo esto:
router.get("/", function(request: Request, response: Response): void { void (async function(): Promise<void> { // do your asychronous work here response.json(/* put your payload here */); })(); });Admito que no me gusta el repetitivo adicional, pero es la mejor respuesta que he encontrado hasta ahora.
La (async function(): Promise<void> {...})(); part es solo una función autoinvocada asíncrona (tenga en cuenta el extra () al final). El void frente a él elimina el tipo de devolución para que ESLint sepa que realmente tiene la intención de ignorar la promesa devuelta. Sin él, obtienes un error de "sin promesas flotantes". Por supuesto, eso significa que usted está asumiendo la responsabilidad de usar try-catch internamente para lidiar con los errores...
Entonces, el resultado final con este enfoque es que la plantilla adicional le permite usar async/await en el Express Router predeterminado.