簡體   English   中英

Typescript 節點快速路由器和第二個參數。 Typescript-eslint/無誤用承諾

[英]Typescript node express router and second argument. Typescript-eslint/no-misused-promises

我應該如何處理 function 注冊來修復@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);

這里是完整的注冊function

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 });
  }
};

這是回旋處,但我以這種方式解決了問題。

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 });
  });
}

我在使用默認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> {...})(); 部分只是一個異步自調用 function(注意末尾的額外() )。 它前面的void去掉了返回類型,這樣 ESLint 就知道你真的打算忽略返回的 promise。沒有它,你會得到一個“no-floating-promises”錯誤。 當然,這意味着您有責任在內部使用try-catch來處理錯誤......

因此,這種方法的最終結果是額外的樣板允許您在默認的 Express Router 中使用 async/await。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM