我是 node.js 的新手,所以我有一种感觉,这将是一些愚蠢的东西,我忽略了,但我还没有能够找到一个解决我的问题的答案。我试图做的是创建一个路径,该路径将创建一个新的子对象,将其添加到父对象的子对象数组中,然后将子对象返回给请求者。我遇到的问题是,如果我将字符串 id 传递给 findById,节点会崩溃
TypeError: 对象{}没有“强制转换”方法
如果尝试传入 ObjectId,则会得到
CastError: 转换为 ObjectId 失败,路径“ _ id”的值为“[ Object Object ]”
下面是我的代码的大致轮廓:
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/child Class/create”路径执行这段代码,这是代码的输出:
错误: CastError: 转换为 ObjectId 失败,路径“ _ id”的值为“[ Object Object ]” {“ path”: “51c35e5ced18cb901d00001”,“ instance”: “ ObjectID”,“ validators”: [] ,“ setters”: [] ,“ getters”: [] ,“ _ index”: null }
我尝试使用 findOne 并传入{ _ id: id } ,但这似乎正是 findById 所做的。我已经尝试了其他站点上列出的 ObjectId 的不同类。我曾尝试像函数一样调用 ObjectId () ,而不是像调用构造函数一样调用 ObjectId () ,结果返回未定义的。此时此刻,我已经想不出什么办法了,而且似乎在谷歌上搜索答案也没什么帮助。知道我哪里做错了吗?
另外,正如我所说的,我是节点/Mongo/猫鼬/Express 的新手,所以如果有更好的方法来实现我的目标,请让我知道。感谢你们的反馈。
编辑:
在从 Peter Lyons 那里得到解决方案之后,我在谷歌上搜索了我遇到的另一个错误,找到了 findByIdAndUpdate,它的工作方式和预期的一样,完全符合我的期望。我仍然不确定为什么 findById 和 findOne 会给我这样的问题,我很好奇(也许需要提交一个 bug 报告) ,所以我将把这个打开,以防其他人有答案。