szi*_*ier 0 javascript csv mongoose mongodb node.js
上下文:我有一个PostMongoose模型,其中包含一个csv_files用于存储csv字符串的数组字段。我fetch从其他Web应用程序发出API请求以发布特定的csv字符串Post。
下面的代码产生一个错误
UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝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);
});
});
Run Code Online (Sandbox Code Playgroud)
模型/ post.js
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 };
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题,以便文档可以正确地保存到csv_files数组中?
将对象保存到Mongo DB时,您必须了解Mongo DB具有适当的版本控制系统。这有助于确保如果保存一次对象,则再次保存时不会导致覆盖先前保存的数据。
这是您看到的错误。如果要在此特定实例中无论版本控制如何都强制更新对象,则可能要使用.update()。这将强制更新对象,而不管其当前保存的状态如何。
这是因为.save()监视并关心版本控制,而.update()将更新对象,而不考虑版本控制。
看来@robertklep 是对的。我通过将第一个 API 调用包装在 a 中Promise,然后在第一个 API 调用完成后执行第二个 API 调用来解决我的问题。
我会等待将其标记为答案,以防万一有人遇到更好的解决方案。
| 归档时间: |
|
| 查看次数: |
3665 次 |
| 最近记录: |