Javascript 为什么即使我有一个catch()函数,也会得到一个未处理的PromisejectionWarning?
我正在尝试使用以下代码将用户保存到我的数据库:Javascript 为什么即使我有一个catch()函数,也会得到一个未处理的PromisejectionWarning?,javascript,node.js,mongoose,promise,es6-promise,Javascript,Node.js,Mongoose,Promise,Es6 Promise,我正在尝试使用以下代码将用户保存到我的数据库: userRoutes.post('/signup', (req, res) => { if (req.session.user) req.session.destroy(); const user = new User(req.body); user.save() .then(savedUser => { req.session.user = savedUser._id;
userRoutes.post('/signup', (req, res) => {
if (req.session.user) req.session.destroy();
const user = new User(req.body);
user.save()
.then(savedUser => {
req.session.user = savedUser._id;
res.status(200).json({
success: true,
data: {
firstName: savedUser.firstName,
lastName: savedUser.lastName,
username: savedUser.username,
email: savedUser.email,
dateCreated: savedUser.dataCreated,
_id: savedUser._id
},
});
})
.catch(error => {
res.status(500).json({
success: false,
error
});
});
});
但我仍然会遇到以下错误:unhandledPromisejectionWarning:unhandledPromisejection拒绝(拒绝id:1):TypeError:cb不是函数
我正在使用mongoose来保存文档。我从未使用过
连接mongo
,我也没有安装mongo来自己尝试一下,但我确实快速查看了源代码,看看是否可以解释您遇到的问题
最新版本(2.0.0)似乎是3周前发布的。我相信这一变化在该版本中有所体现:
这改变了它调用回调的方式
destroy
的处理如下:
然后使用回调调用,如下所示:
我可能完全错了,但这似乎完全符合你的症状。调用了一个名为cb
的函数,它不会首先检查它是否未定义
一个简单的测试是将回调函数传递给destroy
。这应该不是必需的,我相信这是connectmongo
中的一个bug,但它应该有助于确认这确实是您看到的错误的根源。您可以通过将调试器(如Chrome dev工具)附加到节点并单步执行直到出现错误来进一步诊断
如果这确实是问题所在,那么我建议向connectmongo
提交一份bug报告。通过快速查看其他一些会话存储的源代码,在尝试调用回调之前检查回调是否未定义似乎是一种标准做法
我想补充一点,我不认为destroy
是您无论如何都应该在这里使用的方法。我怀疑你想要重新生成。然而,我相信这是一个单独的问题,而不是导致您当前错误的原因
我还要指出,虽然我声明不需要将回调传递给destroy
、regenate
等,但这仍然是一个好主意,因为您应该在继续之前真正等待它完成(或可能失败)。哪里定义了res
?我希望它是一个从承诺返回的对象,并在then()
函数中作为参数声明。我遗漏了什么吗?整个事情都是在一个定义了res的快速路径中,但这不是问题所在,所以我不想用一大堆代码把文章弄得乱七八糟。你能添加完整的错误堆栈吗?TypeError:cb不是一个函数
-我想错误不在这个代码中。你在使用哪个会话存储?有没有可能是connect mongo
?谢谢,我对会话只有模糊的理解,所以我只是从某个地方复制了req.session.destroy,没有停下来意识到它可能是异步的