【发布时间】:2017-11-27 11:12:05
【问题描述】:
我已经设置了一个 Express REST Api,并希望实现一个检查某个对象 ID 是否存在的任务。
如果 Mongo 数据库中存在该 ID,我想使用 Put 请求更新此文档。这部分已经在我的代码中工作了。
如果数据库中尚不存在该 ID,我想创建一个新文档。为此,我尝试将“upsert”选项设置为 true,但如果我现在向一个 ID 发出 put 请求,该 ID 不在我的数据库中,但它会返回错误:
throw er; // Unhandled 'error' event
^
CastError: Cast to ObjectId failed for value "34455ab67" at path "_id" for model "event"
这是我的事件模型代码:
var mongoose = require('mongoose');
var eventSchema = mongoose.Schema({
name: {
type: String,
required: true
}
});
var Events = module.exports = mongoose.model('event', eventSchema, 'event');
module.exports.updateEvent = function (id, event, options, callback) {
var query = {_id : id};
var update = {
name: event.name,
};
Events.findOneAndUpdate(query, update, options, callback);
};
这是 REST API 调用
app.put('/api/event/:_id', function(req, res) {
var id = req.params._id;
var event = req.body;
var options = {
upsert: true,
new: true,
setDefaultsOnInsert: true
};
Events.updateEvent(id, event, options, function(err, event){
if(err){
trow err;
}
res.json(event);
})
});
任何帮助将不胜感激!
【问题讨论】:
-
您在参数中提供给
id的值对于转换为架构中_id字段的ObjectId类型无效,您将其作为您的查询提供陈述。因此,您要么使用不正确的值进行调用,要么实际上是要匹配_id字段以外的另一个属性。您的架构仅显示name和隐含的_id,因此它可能只是一个不正确的值。您能显示您希望更新的实际数据库对象吗?另一个考虑是架构是错误的,需要为_id定义一个String。
标签: node.js mongodb rest express mongoose