我已经设置了一个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);
})
});
任何帮助都将受到高度赞赏!
答案 0 :(得分:2)
发生此错误是因为您定义了没有“_id”的事件架构,因此默认情况下“_id”属性的类型变为“ObjectId”,然后当您尝试使用此值“34455ab67”mongoose方法发送“_id”时将其强制转换为“ObjectId”类型,但它是无效的字符串。所以你应该做到以下几点:
检查以下示例:
var mongoose = require('mongoose');
//inputId is the input string passed from the front end
if (inputId.match(/^[0-9a-fA-F]{24}$/)) {
// it's a valid string to be converted to "ObjectId"
var id = mongoose.Types.ObjectId(inputId);
//then use this id in your mongoose queries.
} else {
//Not valid
}
或者您可以使用“String”类型定义“_id”以简化此过程,但这取决于您的需求。