我是node.js的新手,所以我觉得这将是我忽略的愚蠢之举,但我一直无法找到解决问题的答案。我想做的是创建一个路径,该路径将创建一个新的子对象,将其添加到父对象的子对象数组中,然后将该子对象返回给请求者。我遇到的问题是,如果我将字符串ID传递给findById,节点将崩溃
TypeError:对象{}没有方法“ cast”
如果我尝试传递一个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(),并且返回undefined。在这一点上,我的想法已经用尽了,似乎谷歌搜索答案似乎没有帮助。关于我在做什么错的任何想法吗?
另外,就像我说的那样,我是node / Mongo / Mongoose / Express的新手,所以如果有更好的方法可以实现我的目标,请告诉我。我感谢所有反馈。
编辑:
经过Peter Lyons的解决方法之后,我用谷歌搜索了我遇到的另一个错误,并找到了findByIdAndUpdate,它可以按预期运行,并且完全符合我的期望。我仍然不确定为什么findById和findOne会给我这样的问题,并且我很想知道(也许需要提交错误报告),所以我会在其他人有答案的情况下保持此状态。
findOne
用一个调用,ObjectId
但是findOne
期望键/值条件的常规JS对象。