Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose-版本错误:找不到id的匹配文档_Javascript_Node.js_Mongodb_Csv_Mongoose - Fatal编程技术网

Javascript Mongoose-版本错误:找不到id的匹配文档

Javascript Mongoose-版本错误:找不到id的匹配文档,javascript,node.js,mongodb,csv,mongoose,Javascript,Node.js,Mongodb,Csv,Mongoose,Context:我有一个PostMongoose模型,其中包含一个csv\u文件数组字段来存储csv字符串。我从不同的web应用程序发出fetchAPI请求,以发布特定POST的csv字符串 下面的代码产生一个错误 未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:2):VersionError:未找到id为“5966932399e969ad8013bedf”的匹配文档 router.js router.post('/posts/:url/upload-csv/:c

Context:我有一个
Post
Mongoose模型,其中包含一个
csv\u文件
数组字段来存储csv字符串。我从不同的web应用程序发出
fetch
API请求,以发布特定
POST
的csv字符串

下面的代码产生一个错误

未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:2):VersionError:未找到id为“5966932399e969ad8013bedf”的匹配文档

router.js

router.post('/posts/:url/upload-csv/:csv_name', (req, res) => {
  let csv_name = req.params.csv_name;
  let csv_string = csv_name+req.body.csv_string;

  Post.findOne({url: req.params.url})
    .then((post) => {
      if (post.csv_files.length === 0) {
        post.csv_files.push(csv_string);
      } else {
        let foundExistingCSV = false;
        for (var i = 0; i < post.csv_files.length; i++) {
          if (post.csv_files[i].includes(csv_name)) {
            foundExistingCSV = true;
            post.csv_files[i] = csv_string;
            break;
          }
        }
        if (!foundExistingCSV) post.csv_files.push(csv_string);
      }

      post.markModified('csv_files');
      post.save();

      return res.status(200);
    })
    .catch((err) => {
      console.log(err);
      return res.status(400);
    });
});
const mongoose    = require('mongoose');

var stringPreset = {
  type: String,
  uppercase: true
}

var Post = mongoose.model('Post', {
  name                 : stringPreset,
  url                  : String,
  password             : String,
  csv_files            : { type : Array , "default" : [] },
  updatedAt            : { type: Date, default: Date.now }
});

module.exports = { Post };

如何修复此问题,使文档保存到
csv\u文件
数组中而不出现错误?

看起来@robertklep是正确的。我修复了我的问题,将第一个API调用包装在
Promise
中,然后在第一个API调用完成后执行第二个API调用


我将等待将此标记为答案,以防有人遇到更好的解决方案。

将对象保存到Mongo DB时,您必须了解Mongo DB有一个版本控制系统。这有助于确保如果只保存一次对象,再次保存时不会覆盖以前保存的数据

这就是你看到的错误。如果要强制对象更新,而不考虑此特定实例中的版本控制,则可能需要使用.update()。这将强制更新对象,而不管其当前保存的状态如何


这是因为.save()监视并关心版本控制,而.update()将更新对象,而不管版本控制如何。

请在此评论我的问题

错误消息:

update: function (data) {

        var session = new Session(data);
        database.logging("INFO", "session-update", session.cid, session.order.orderNumber);
        return new Promise(function (resolve, reject) {

            session.save()
                .then(savedSession => resolve(savedSession))
                .catch(savedSessionError => reject(savedSessionError))
        });

    }
消息:“未找到id为“5c86d3a15bbcb965d85d80d1”的匹配文档” 版本3',名称:'VersionError',版本:3

我的代码:

update: function (data) {

        var session = new Session(data);
        database.logging("INFO", "session-update", session.cid, session.order.orderNumber);
        return new Promise(function (resolve, reject) {

            session.save()
                .then(savedSession => resolve(savedSession))
                .catch(savedSessionError => reject(savedSessionError))
        });

    }
我的参数“data”已经是一个Mongoose对象,我正在创建一个新的并试图保存它。就像@daopenhagen所说的,save()检查文档的版本,并抛出VersionError错误

我是如何修复的 只是删除Session()对象的创建。 删除此行

var session = new Session(data);

我希望这能有所帮助。

我从正文的更新请求中删除了version属性

删除请求正文


是否有可能是多个请求导致同一文档(几乎)同时得到处理?@robertklep Checking concurrent access修复了我的问题,谢谢!你能写一个答案吗?