为什么即使我有catch()函数也会得到UnhandledPromiseRejectionWarning?

时间:2017-10-29 10:14:45

标签: 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;

        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
        });
    });
});

但我仍然收到此错误:UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: cb is not a function

我正在使用mongoose来保存文档。

1 个答案:

答案 0 :(得分:1)

我从未使用过connect-mongo而且我没有安装Mongo自己试一试,但我确实快速查看了源代码,看看能不能解释一下这个问题你有。

似乎最新版本(2.0.0)于3周前发布。我相信这个版本在该版本中有所体现:

https://github.com/jdesboeufs/connect-mongo/commit/a8b0fd49368cfc1ea634d4245105e706d2dd98c9

这改变了它调用回调的方式。

destroy的处理在这里:

https://github.com/jdesboeufs/connect-mongo/blob/509c8732061b7786857f6b835f547980c1d81c7f/src/index.js#L292

然后调用withCallback,这是:

https://github.com/jdesboeufs/connect-mongo/blob/509c8732061b7786857f6b835f547980c1d81c7f/src/index.js#L5

我可能完全错了,但这似乎完全符合你的症状。我们调用了一个名为cb的函数,它不会先检查它是否未定义。

一个简单的测试是将回调函数传递给destroy。这不应该是必需的,我相信它是connect-mongo中的一个错误,但它应该有助于确认这确实是您所看到的错误的根源。您可以通过将调试器(例如Chrome开发工具)附加到您的节点并逐步完成直到您遇到错误来进一步诊断。

如果这确实是问题,那么我建议使用connect-mongo提交错误报告。通过快速浏览一些其他会话存储的源代码,在尝试调用回调之前检查回调是否未定义似乎是标准做法。

我想补充一点,我不认为destroy是你应该在这里使用的方法。我怀疑你想要regenerate。但是,我认为这是一个单独的问题,而不是导致您当前错误的原因。

我还注意到,虽然我声明不需要将回复传递给destroyregenerate等,但是当你回复时仍然是一个好主意在继续之前,应该真的等待它完成(或者可能失败)。