我有一些MongoDB文档使用以下模式:
Id: {type: "id", key: true, computed: true, nullable: false},
Name: {type: "string", nullable: false, maxLength: 50}
这些文档由一个小型web应用程序(我使用的是Express、JayData和Mongoose)公开为OData。以下是其中一些文件:
{ "_id" : ObjectId("5343fd656b9c5c084b8f2a70"), "Name" : "Service74"},
{ "_id" : ObjectId("5343fd656b9c5c084b8f2a6f"), "Name" : "Service73"},
{ "_id" : ObjectId("5343fd656b9c5c084b8f2a6e"), "Name" : "Service72"},
...
如果我键入与Service74相对应的地址http://localhost:8080/marketplace/Services('5343fd656b9c5c084b8f2a70')
,我会得到以下结果:
...
<d:Id>NTM0M2ZkNjU2YjljNWMwODRiOGYyYTcw</d:Id>
<d:Name>Service74</d:Name>
...
当然,如果我使用结果中指定的Id,我会获得相同的页面。
当我尝试使用猫鼬函数时出现问题findById:
app.post("/addCompare/:id", function(req, res) {
console.log(req.params.id);
Services.findById(req.params.id, function(err, service) {
if(!err) {console.log(service);}
else {console.log(err);}
});
res.send(200);
});
我得到这个NTM0M2ZkNjU2YjljNWMwODRiOGYyYTcw
,然后这个错误:
{ message: 'Cast to ObjectId failed for value "NTM0M2ZkNjU2YjljNWMwODRiOGYyYTU5" at path "_id"',
name: 'CastError',
type: 'ObjectId',
value: 'NTM0M2ZkNjU2YjljNWMwODRiOGYyYTU5',
path: '_id' }
我哪里错了?如果我错过了其他信息,请告诉我。。。
谢谢。
PS:我在这里发现了一个类似的问题Mongoose:Cast-to-ObjectId失败了,但如果我通过包含以下定义来更改Mongoose的模型定义(实际上我没有声明id):
var serviceSchema = mongoose.Schema({
_id: String,
...
没有任何变化。。。
5343fd656b9c5c084b8f2a70
是服务器端使用的实体的内部标识符。这个值是通过OData以base64编码的,这就是您在Id字段中收到NTM0M2ZkNjU2YjljNWMwODRiOGYyYTcw
的原因。通过在收到的Id上调用atob(req.params.id)
,可以很容易地通过Id检索实体。