[英]Node.js find result by ID from mongoDB
我是Node.js的新手,很抱歉,如果这是一个非常愚蠢的问题,但是我尝试我找不到答案。
我有一些简单的代码:
var express = require("express");
var mongoose = require("mongoose");
var cors = require("cors");
mongoose.connect('mongodb://localhost/simple')
var personSchema = {
firstName:String,
lastName:String,
email:String
}
var Person = mongoose.model('Person', personSchema, 'people')
var app = express();
app.use(cors());
app.get('/people', function (req, res) {
Person.find(function (err, doc) {
res.send(doc);
})
})
app.get('/people/:id', function (req, res) {
Person.findById(req.params.id, function (err, doc) {
res.send(doc);
})
})
app.listen(3000);
这应该返回我插入mongo DB的一些数据,而第一个/ people /返回一切正确(基本上只返回DB的转储)
带ID的第二个没有返回。 我尝试调试它,我看到函数ID内部定义正确,我也使用来自“人”网站的ID(类似于: 55e028081181bfdd8a7972d2
),这个事实我不能得到任何答案或错误。
是否有人可以告诉我哪里可能有问题?
是时候这个问题被揭穿了,因为我自己已经厌倦了这里的错误回应。
代码作为一个单位是好的。 可能出现的唯一问题是您发送错误的内容或处理错误的集合,以及有关_id
值本身的最后一个问题。
你需要除了“原始”快递和猫鼬之外的其他任何东西,因为我的列表证明:
var async = require('async'),
express = require('express'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/simple');
var personSchema = new Schema({
firstName: String,
lastName: String,
email: String
});
var Person = mongoose.model( 'Person', personSchema );
var app = express();
mongoose.connection.on('open',function(err) {
async.series(
[
function(callback) {
Person.remove({},callback);
},
function(callback) {
Person.create({
firstName: "John",
lastName: "Doe",
email: "john.doe@example.com"
},callback);
}
],
function(err,results) {
if (err) throw err;
console.log(
"Created and call in URL: %s",
results[1]._id
);
// setup routes
app.get('/people', function(req,res) {
Person.find(function(err,docs) {
res.send(docs)
});
});
app.get('/people/:id', function(req,res) {
Person.findById(req.params.id,function(err,doc) {
res.send(doc);
});
});
app.listen(3000);
console.log("ready");
}
);
});
这给出了如下输出:
Created and call in URL: 55e0464e66e13f6506e8e38e
ready
所以当你在/people
url上调用服务器时,你得到:
[
{
"_id":"55e0464e66e13f6506e8e38e",
"firstName":"John",
"lastName":"Doe",
"email":"john.doe@example.com",
"__v":0
}
]
作为回应。
当你在/people/55e0464e66e13f6506e8e38e
使用id调用时,你会得到:
{
"_id":"55e0464e66e13f6506e8e38e",
"firstName":"John",
"lastName":"Doe",
"email":"john.doe@example.com",
"__v":0
}
正如所料。
因此,如果您的应用程序不起作用,那么您要么不发送您认为自己的内容,要么实际上在集合中有_id
值的字符串,或者它在集合或数据库名称中完全不匹配。 所有网址都应该有效,如果没有工作,那么后者就是这种情况。
如果_id
是一个字符串,那么架构是错误的,需要:
var personSchema = new Schema({
_id: String
firstName: String,
lastName: String,
email: String
},{ "_id": false });
最重要的是,除了为模式中的_id
字段设置正确的类型之外,还有{ "_id": false }
。
这是因为您需要告诉mongoose 不要尝试将“字符串”解析为ObjectId
因为它默认情况下总是如此。
如果没有这个设置,“字符串”将始终失败。
但是这个列表证明了什么是有效的,也是唯一真正需要的变化,如果实际上_id
包含“字符串”或其他类型。 因此,如果一个Number
然后都为_id: Number
和{ "_id": false }
设置了模式,否则会出现相同的失败原因。
为了纯粹的愚蠢,然后将我的列表更改为:
var personSchema = new Schema({
_id: { type: String, default: "55e0464e66e13f6506e8e38e" },
firstName: String,
lastName: String,
email: String
},{ "_id": false });
并且每次都看它工作。
并且还请删除{ "_id": false }
并观察它失败,以便明确为什么在要覆盖_id
类型时需要这样做。
如果您已从mongoose外部填充数据库,则可能已更改_id
属性的类型。 如果是这种情况,请尝试将_id添加到您的架构中,如下所示:
var personSchema = {
firstName:String,
lastName:String,
email:String,
_id:String
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.