我是 node.js 的新手,所以我觉得这将是我忽略的一些愚蠢的事情,但我一直无法找到解决我问题的答案。我要做的是创建一个路径,该路径将创建一个新的子对象,将其添加到父对象的子数组中,然后将子对象返回给请求者。我遇到的问题是,如果我将字符串 id 传递给 findById,节点会崩溃
类型错误:对象 {} 没有方法“强制转换”
如果我尝试传入一个 ObjectId ,我会得到
CastError:在路径“_id”处为值“[object Object]”转换为 ObjectId 失败
这是我的代码的粗略轮廓:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId; //Have also tried Schema.Types.ObjectId, mongoose.ObjectId
mongoose.connect('mongodb://user:password@server:port/database');
app.get('/myClass/:Id/childClass/create', function(request, result) {
var id = new ObjectId(request.params.Id);
MyClass.findById(id).exec( function(err, myClass) {
if (err || !myClass) { result.send("error: " + err + "<br>" + JSON.stringify(id) || ("object '" + request.params.Id + "' not found: " + id)); return; }
var child = ChildClass();
myClass.Children.addToSet(child);
myClass.save();
result.send(child);
});
});
如果我使用路径“/myClass/51c35e5ced18cb901d000001/childClass/create”执行此代码,这是代码的输出:
错误:CastError:在路径“_id”{“path”:“51c35e5ced18cb901d000001”,“instance”:“ObjectID”,“validators”:[],“setters”:[ ],"getters":[],"_index":null}
我尝试使用 findOne 并传入 {_id:id} ,但这似乎正是 findById 所做的。我已经尝试过其他网站上列出的 ObjectId 的不同类。我试过像函数而不是构造函数一样调用 ObjectId() 并且返回未定义。在这一点上,我的想法已经用完了,而且谷歌搜索似乎没有帮助。关于我做错了什么的任何想法?
另外,就像我说的,我是 node/Mongo/Mongoose/Express 的新手,所以如果有更好的方法来实现我的目标,请告诉我。我感谢所有反馈。
编辑:
在 Peter Lyons 的解决方法之后,我搜索了另一个我遇到的错误并找到了 findByIdAndUpdate,它按预期工作并且完全符合我的期望。我仍然不确定为什么 findById 和 findOne 会给我这样的问题,我很想知道(可能需要提交错误报告),所以我会保持打开状态,以防其他人有答案。