[英]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.