3

我正在构建一个使用猫鼬访问数据库的快速路由器。我当前的问题依赖于这段代码:

app.use("/authreset", (req, res) => {
    authenticator
        .resetPassword(
            req.body.username,
            req.body.password,
            req.body.token,
            req.body.type
        )
        .then((response, error) => {
            if (error) throw new Error(error);

            console.log('*****************');
            console.log(response);

            if (!response) {
                res.sendStatus(401);
                return;
            }
        })
        .catch(error => {
            console.log('*****************');
            console.log(error);
            if (error) throw new Error(error);
        });

});

resetPassword 使用以下猫鼬调用:

return UserModel
    .findByIdAndUpdate(user.id, data, { new: true })
    .exec();

出于某种原因,我的路线被调用并且响应很好(检查了console.log(response)内部承诺)。

我的问题是响应永远不会发送回客户端,这会使 fetch 调用超时。

为什么我的承诺不返回数据?

4

1 回答 1

3

呃,你记录了response,但你从来没有记录过send(或者至少用状态码响应)?

您的代码应该看起来更像

app.use("/authreset", (req, res) => {
    authenticator.resetPassword(
        req.body.username,
        req.body.password,
        req.body.token,
        req.body.type
    ).then(response => {
        console.log(response);

        if (!response) {
            return res.sendStatus(401);
        } else {
            return res.sendStatus(200); // <<<
        }
    }, error => {
        console.log(error);
        return res.sendStatus(500);
    });
});

请注意,then回调永远不会被多个参数调用,因此error您正在检查的情况不会发生。在catch处理程序中,如果没有进一步处理,您永远不应该再次throw出现错误。我也.then(…).catch(…)了更合适的.then(…, …)

于 2018-02-24T05:21:09.740 回答