javascript - 使用 mongoose 和 Promise.all 更新子文档

标签 javascript node.js reactjs express mongoose

当我检查 PromiseArr 中的值时出现此错误,有人可以帮忙吗?或者您能建议更好的方法吗?谢谢!

**Error**  <rejected> { MongooseError: Callback must be a function, got [object Object]
    at new MongooseError (D:\Profiles\myuser\Desktop\MERN stack\React\KukuluTech\node_modules\mongoose\lib\error\mongooseError.js:11:11)
    at Function.Model.$wrapCallback (D:\Profiles\myuser\Desktop\MERN stack\React\KukuluTech\node_modules\mongoose\lib\model.js:4481:11)
    at Function.Model.findOneAndUpdate (D:\Profiles\myuser\Desktop\MERN stack\React\KukuluTech\node_modules\mongoose\lib\model.js:1995:21)
    at Promise (D:\Profiles\myuser\Desktop\MERN stack\React\KukuluTech\apiServer.js:153:13)
    at new Promise (<anonymous>)
    at runUpdate (D:\Profiles\myuser\Desktop\MERN stack\React\KukuluTech\apiServer.js:151:12)
    at players.forEach (D:\Profiles\myuser\Desktop\MERN stack\React\KukuluTech\apiServer.js:164:47)
    at Array.forEach (<anonymous>)
    at D:\Profiles\myuser\Desktop\MERN stack\React\KukuluTech\apiServer.js:164:11
    at Layer.handle [as handle_request] (D:\Profiles\myuser\Desktop\MERN stack\React\KukuluTech\node_modules\express\lib\router\layer.js:95:5)
    at next (D:\Profiles\myuser\Desktop\MERN stack\React\KukuluTech\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (D:\Profiles\myuser\Desktop\MERN stack\React\KukuluTech\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (D:\Profiles\myuser\Desktop\MERN stack\React\KukuluTech\node_modules\express\lib\router\layer.js:95:5)
    at D:\Profiles\myuser\Desktop\MERN stack\React\KukuluTech\node_modules\express\lib\router\index.js:281:22
    at param (D:\Profiles\myuser\Desktop\MERN stack\React\KukuluTech\node_modules\express\lib\router\index.js:354:14)
    at param (D:\Profiles\myuser\Desktop\MERN stack\React\KukuluTech\node_modules\express\lib\router\index.js:365:14)
    message: 'Callback must be a function, got [object Object]',
    name: 'MongooseError' } },

文档

{
    "_id" : ObjectId("5b8fe90d118cde2df47e6c7f"),
    "game_num" : 1,
    "game_round" : 32,
    "num_of_cards" : 26,
    "players" : [ 
        {
            "_id" : ObjectId("5b8fe90d118cde2df47e6c81"),
            "player" : ObjectId("5b8eba0916028e238c8981ac"),
            "total_score" : 0,
            "current_bet" : 1
        }, 
        {
            "_id" : ObjectId("5b8fe90d118cde2df47e6c80"),
            "player" : ObjectId("5b8eb9f716028e238c8981ab"),
            "total_score" : 0,
            "current_bet" : 1
        }
    ],
    "rounds" : [ 
        {
            "_id" : ObjectId("5b905593ae528e2320fab391"),
            "player" : ObjectId("5b8eb9f716028e238c8981ab"),
            "round" : 32,
            "bet" : 1
        }, 
        {
            "_id" : ObjectId("5b905593ae528e2320fab390"),
            "player" : ObjectId("5b8eba0916028e238c8981ac"),
            "round" : 32,
            "bet" : 1
        }    
   ],
    "date" : ISODate("2018-09-05T14:32:45.377Z"),
    "__v" : 32
}

API:

//---->>>> POST CURRENT_BET <<<<-----
app.post("/game/current_bet/:_id", function(req, res) {
  const gameId = req.params._id;
  const betsObject = req.body.betsData;
  const players = req.body.players;

  let promiseArr = [];

  function runUpdate(playerObj) {
    return new Promise((resolve, reject) => {
      //you update code here
      Games.findOneAndUpdate(
        { _id: gameId },
        { "players.player": playerObj.player },
        { $set: { "players.$.current_bet": betsObject[playerObj.player] } },
        { new: true }
      )
        .then((result) => resolve())
        .catch((err) => reject(err));
    });
  }

  players.forEach((player) => promiseArr.push(runUpdate(player)));

  Promise.all(promiseArr)
    .then((game) => res.json(game))
    .catch((err) => {
      res.status(404).json({ gamenotfound: "No game found" });
    });
});

最佳答案

请查看API findOneAndUpdate 。您没有正确传递参数,似乎您需要传递如下内容

function runUpdate(playerObj) {
    return new Promise((resolve, reject) => {
      //you update code here
      Games.findOneAndUpdate(
        { _id: gameId, "players.player": playerObj.player },
        { $set: { "players.$.current_bet": betsObject[playerObj.player] } },
        { new: true }
      )
        .then((result) => resolve())
        .catch((err) => reject(err));
    });
  }

关于javascript - 使用 mongoose 和 Promise.all 更新子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52203832/

相关文章:

javascript - 为什么 Firestore 返回集合引用,但我的程序将其视为数组?

html - 在带有 NodeJS 电子邮件模板的邮件中使用 Google 字体

javascript - Testcafe LocalStorage 的问题

javascript - 将 SeqeunceJS 与 Twitter Bootstrap 3.0 集成

javascript - 在 JavaScript 中如何访问另一个对象的数据?

javascript - 为什么对象返回值时返回undefined

file-upload - 在 NodeJs 中上传文件时停止请求

javascript - Mocha 在完成所有测试之前结束测试运行

reactjs - 将 React 库导入 Codepen(即 prop-types)

javascript - react native : How to reference current route in Navigator's navigationBar={}?