用猫鼬和promise.all更新子文档

时间:2018-09-06 12:11:23

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

1 个答案:

答案 0 :(得分:2)

请使用外观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));
    });
  }