node.js异步多个等待不适用于用户注册

Posted

技术标签:

【中文标题】node.js异步多个等待不适用于用户注册【英文标题】:node.js async multiple await not working for user signup 【发布时间】:2021-08-03 16:58:20 【问题描述】:

我正在尝试使用 async/await 重现此代码,但我不知道如何

.then.catch 链/巢

exports.signup = (req, res, next) => 
  bcrypt.hash(req.body.password, 10)
    .then(hash => 
      const user = new User(
        email: req.body.email,
        password: hash
      );
      user.save()
        .then(() => res.status(201).json( message: 'Utilisateur créé !' ))
        .catch(error => res.status(400).json( error ));
    )
    .catch(error => res.status(500).json( error ));
;

我在尝试使用 async/await 时的想法

exports.signup = async (req, res, next) => 
    try 
       const hash = await bcrypt.hash(req.body.password, 10);
       const user = new User(
           email: req.body.email,
           password: hash
       );
       console.log(user);
       let saveUser = await user.save();
       console.log(saveUser);
       res.status(201).json( message: 'Utilisateur créé !')
     catch (e) 
        res.status(500).json(e)
    
;

我在控制台中获取用户,但代码在 user.save() 期间崩溃,因为我没有从 console.log(saveUser) 获得任何信息

我一直在阅读,您可以将 await 函数堆叠到一个 try 块中,但也许在这里它不起作用,因为您需要

我尝试过分离 try/catch,要求我在 try 块之外初始化哈希,因为我将在第二次尝试中使用它,但它也不起作用。

按照Nil Alfasir的想法编辑后:

exports.signup = async (req, res, next) => 
    try 
       const hash = await bcrypt.hash(req.body.password, 10);
       const user = new User(
           email: req.body.email,
           password: hash
       );
       console.log(user);
       user.save();
       return res.status(201).json( message: 'Utilisateur créé !')
     catch (e) 
        return res.status(500).json(e)
    
;

但我在控制台中得到了这个

(node:43390) UnhandledPromiseRejectionWarning: MongoError: E11000 duplicate key error collection: myFirstDatabase.users index: username_1 dup key:  username: null 
.
.
.
(node:43390) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:43390) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

【问题讨论】:

您看到的错误是什么? 【参考方案1】:

在保存异步时纠正 Nir ​​Alfasi

    save() 一个异步函数SAVE ASYNC

所以它不会返回任何东西。

如果有错误可以被捕获。

【讨论】:

所以我不应该在 res.status(xxx).json( ) 之前写 return ?【参考方案2】:

几个问题:

    user.save() 不返回任何值(根据第一个 sn-p) - 您正在尝试将返回的值保存到 saveUser Nit:请在res.status... 之前添加return

更新

问题的“更新”完全改变了它,请避免这样做并在将来发布新问题。

听起来您必须在创建用户时提供username,因为用户名必须是唯一的,并且当您尝试创建多个没有用户名的用户时,数据库会使用username=null 创建一条记录,因此第一个可能会创建但第二个会失败。

【讨论】:

1.我以前没有它,但我在控制台 2 中遇到错误。好的,我这样做是因为 ***.com/questions/52832010/mongoose-await-save 3。好的!现在我已经清理到只有 user.save(),这就是我在控制台中得到的 ``` (node:43390) UnhandledPromiseRejectionWarning: MongoError: E11000 duplicate key error collection: myFirstDatabase.users index: username_1 dup key: username: null ``` 我的用户模型中没有用户名字段 我发现了问题!实际上,我之前已经使用过 MongoDB Atlas 集群并且已经创建了一个用户模式。旧模式需要一个昵称,我完全忘记了它。我只是编辑了我的模型以在 mongodb 中创建一个新集合,并且一切正常,无论是否在 user.save() 前面等待 @Gradient 是“昵称”还是“用户名”?

以上是关于node.js异步多个等待不适用于用户注册的主要内容,如果未能解决你的问题,请参考以下文章

node js异步IO机制

Node.js/Mongoose 等待异步 For 循环

如何在 node.js 中使用 axios 循环许多 http 请求

Node.js 与 .net 中的异步/等待

在 Node.js 中等待异步函数返回

Node.js 异步等待快递