簡體   English   中英

用貓鼬和promise.all更新子文檔

[英]Updating subdocument with mongoose and promise.all

當我檢查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));
    });
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM