获取 Express API/Mongoose 调用后承诺不触发 .then()

Posted

技术标签:

【中文标题】获取 Express API/Mongoose 调用后承诺不触发 .then()【英文标题】:Promise not triggering .then() after fetch Express API/Mongoose call 【发布时间】:2021-02-12 13:27:14 【问题描述】:

我希望有人能告诉我为什么我没有返回一个承诺并调用 .then() 。

我正在为我的 Pokemon 卡片创建一个库存系统,其中包含一个 react 前端和一个 express 后端。当我点击 FE 上的“增加库存”按钮时,调用 API 的函数如下:

incInventory(card, cond) 
  // this.setState(currentValue: this.state.currentValue + 1);
  const result = fetch('http://mySecretAPIServer/items/' + card._id, 
    method: 'PUT',
    headers: 
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    ,
    // We convert the React state to JSON and send it as the POST body
    body: JSON.stringify(_id: card._id, cond: cond, op: "incQuantity", otherId: card.id)
  );
  console.log(result);
  // ***WHY ISN'T THIS RUNNING?!?!?!?***
  result.then((res) => 
    console.log("this isn't printing...");
  );

这是它命中的 Express 端点:

// UPDATE (Modify)
router.put('/:id', (req, res) => 
    const conditionToUpdate = "q" + req.body.cond;
    const amtToUpdate = req.body.op === 'incQuantity' ? 1 : -1;

    return new Promise((resolve, reject) => 
        Pokemon.findByIdAndUpdate(req.params.id, $inc: [conditionToUpdate]: amtToUpdate, (err, result) => 
            resolve(result);
        ));
);

如您所见,我正在尝试从端点返回一个承诺。在 FE 上 fetch 之后,这是在尝试调用 .then() 之前 promise 的样子:

但是.then() 永远不会运行。我什至不需要 fetch 中的数据,真的——我只需要在 fetch 完成后触发一些代码。

希望有人可以帮助我了解我所缺少的!谢谢!

【问题讨论】:

您是否也尝试过.catch 来检查错误? 您是否尝试过在服务器中使用res.send() 进行实际响应? - 服务器代码中返回的 Promise 不是您对请求发送响应的方式 - 查看如何使用 express - expressjs.com/en/starter/hello-world.html @JaromandaX 不像这个问题中的口袋妖怪,OP 似乎不想抓住他们所有 @Phil - 我的天啊!!!你是爸爸对吧!!! :p 你们完全是我的星期五 【参考方案1】:

您正在返回承诺并解决它,但您没有使用 res 向客户端发送任何响应。

在快递代码中,不需要有promise,可以这样做:

router.put('/:id', (req, res) => 
    const conditionToUpdate = "q" + req.body.cond;
    const amtToUpdate = req.body.op === 'incQuantity' ? 1 : -1;

    Pokemon.findByIdAndUpdate(req.params.id, $inc: [conditionToUpdate]: amtToUpdate, (err, result) => 
        res.json(result);
    ));
);

【讨论】:

是的!!!从这个和上面的评论中,我已经修复它并且它正在工作!!!谢谢! Pokemon.findByIdAndUpdate(req.params.id, $inc: [conditionToUpdate]: amtToUpdate) .then(modified => res.json(modified)) .catch(err => console.log(err)); ); 是的---解决得太快了,我需要再等 3 分钟才能接受答案,哈哈

以上是关于获取 Express API/Mongoose 调用后承诺不触发 .then()的主要内容,如果未能解决你的问题,请参考以下文章

单元/集成测试 Express REST API, mongoose, mocha, sinon, chai, supertest

wechat,wechat-api,mongoose,winston等的使用

用于组织的 Node.js Express 导出路由?

IIS Express 启用目录浏览 方法

express中怎么获取请求的完整路径

Express-js 无法获取我的静态文件,为啥?