【问题标题】:Typescript node express controller. What type of return has to be?打字稿节点快递控制器。必须是什么类型的回报?
【发布时间】:2021-01-11 20:16:40
【问题描述】:

node express 中有什么类型的返回函数?我读到我可以写 anyvoid。在这种情况下,void 正好是 NOT。有什么建议吗?现在我看到我可以像这样使用Promise<Response<any>>,我应该关闭这条规则“@typescript-eslint/no-explicit-any”,但我不想关闭它

                                                     //Here: Promise<Response<any>> 
export default async function registration(req: TreqBodyReg, res: Response) {
  try {
    const { email, password } = req.body;
    const candidate = await ModelUser.findOne({ email }) as TreqBodyReg;
    if (candidate) {
      return res.status(400).json({ message: `There is user with email ${email}` });
    }
    const hashPassword = bcrypt.hashSync(password, 7);
    const user = new ModelUser({ email, password: hashPassword });
    await user.save();
    return res.status(200).json({ message: `The user by email ${email} was successfully registered` });
  } catch (err) {
    console.log(err);
    // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
    return res.status(400).json({ message: `registration error is ${err}` });
  }
};

【问题讨论】:

    标签: typescript express


    【解决方案1】:

    Express 不希望中间件/路由函数有任何返回值,因此 void 是合适的——在你的情况下是 Promise&lt;void&gt;,因为你使用的是 async 函数:

    export default async function registration(req: TreqBodyReg, res: Response): Promise<void> {
    

    有些人喜欢将return 与他们所做的最后一件事结合使用,就像你在这里所做的那样:

    return res.status(400).json({ message: `There is user with email ${email}` });
    

    Express documentation 没有列出 json 的任何返回值,因此它可能会导致 undefined,尽管许多 Express 方法是“可链接的”,因此它可能会返回 Response。如果是这样,您可以将这些行分开:

    res.status(400).json({ message: `There is user with email ${email}` });
    return;
    

    【讨论】:

    • (就风格而言,我从不关心从 Express 中间件处理程序返回函数调用的结果。它们并不意味着返回任何东西,所以我使用 bare return; 我需要提早放弃。但我也尽量避免提早放弃,通过保持我的处理程序简短,依赖可重用的辅助函数。)
    • 我之前也是这么想的,但我认为 eslint 会骂我,因为我什么都不回,但它不会。问题解决了,谢谢
    • 出错了怎么办?留下吗?
    • @HackerMF - 可能,因为任何值都可以在 JavaScript 中抛出。
    【解决方案2】:

    代码是这样写的

    export default async function registration(req: TreqBodyReg, res: Response): Promise<Response<void>> {
      try {
        const { email, password } = req.body;
        const candidate = await ModelUser.findOne({ email }) as TreqBodyReg;
        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) {
        console.log(err);
        // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
        res.status(400).json({ message: `registration error is ${err}` });
      }
    };
    

    【讨论】:

      猜你喜欢
      • 2018-04-10
      • 1970-01-01
      • 2018-01-05
      • 2016-11-06
      • 2023-01-09
      • 2017-02-22
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多