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异步多个等待不适用于用户注册的主要内容,如果未能解决你的问题,请参考以下文章