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,没有停下来意识到它可能是异步的