承诺不返回任何数据以获取返回

Posted

技术标签:

【中文标题】承诺不返回任何数据以获取返回【英文标题】:Promise not returning any data for fetch return 【发布时间】:2018-08-04 04:53:49 【问题描述】:

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

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 使用以下 mongoose 调用:

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

由于某种原因,我的路由被调用并且响应很好(检查了console.log(response) inside promise)。

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

为什么我的 promise 没有返回数据?

【问题讨论】:

哪个promise是用来返回数据的,它是用来把数据返回到哪里的? - 在您发布的代码中看不到任何返回数据,甚至在响应中发送数据 【参考方案1】:

呃,你记录了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 错误。我也是changed .then(…).catch(…) to the more fitting .then(…, …)

【讨论】:

其实我不需要客户端的响应,只需要状态。 401失败,200成功。我删除了res.send(response),但我的客户仍然卡住了...... 没什么,但我遇到了问题。我需要return res.sendStatus(200) 或其他什么。我将编辑您的代码。感谢您的帮助。 也许有一点解释与代码一起去? @jfriend00 啊,OP的编辑删除了我解释的主要部分,没有注意到

以上是关于承诺不返回任何数据以获取返回的主要内容,如果未能解决你的问题,请参考以下文章

从异步函数返回的承诺中获取价值

Javascript - 异步等待和获取 - 返回值,而不是承诺?

获取返回承诺状态:待定

Firebase 函数不返回数据

承诺等待得到解决而不返回

修改返回数据,然后在打字稿/离子中返回承诺