2015-08-28 50 views
4

我是Node.js中的新成員,所以很抱歉,如果這確實是一個愚蠢的問題,但是我嘗試找不到答案。Node.js通過mongoDB中的ID查找結果

我有一些簡單的代碼:

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); 

這應該返回一些數據我插入到蒙戈DB,而第一個/人/返回正確的一切(basicly只是返回數據庫的轉儲)

的第二個ID不返回。我嘗試調試它,並且我發現函數ID內部的定義是正確的,我還使用了來自「人員」站點的ID(類似於:55e028081181bfdd8a7972d2),儘管如此,我無法獲得任何答案或錯誤。

有人有機會告訴我哪裏可以成爲問題嗎?

+4

你是否嘗試過使用ObjectId構造函數,如http://stackoverflow.com/questions/6578178/node-js-mongoose-js-string-to-objectid-function? – mguimard

+0

我不確定你的意思,你的意思是這樣的: http://pastebin.com/nFxSrZqw 如果是遺憾的是它不適用於我:( – Andurit

+0

是否已經使用您的應用程序填充了數據的MongoDB並通過貓鼬或通過任何其他方法? –

回答

3

它的時間,這一問題被揭穿,因爲我自己也很厭倦了這裏的假響應。

作爲一個單位的代碼很好。唯一可能發生的問題是您發送錯誤的東西或收集到錯誤的集合,以及最後一個涉及價值本身的問題。

你需要什麼比「原始」等表達和貓鼬這個工作,因爲我的上市證明:

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: "[email protected]" 
     },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"); 

    } 
); 

}); 

其中給出的輸出,如:

所以,當你調用服務器在/people你得到的網址:

[ 
    { 
     "_id":"55e0464e66e13f6506e8e38e", 
     "firstName":"John", 
     "lastName":"Doe", 
     "email":"[email protected]", 
     "__v":0 
    } 
] 

作爲迴應。

而當你用id作爲/people/55e0464e66e13f6506e8e38e打電話,那麼你得到:

{ 
    "_id":"55e0464e66e13f6506e8e38e", 
    "firstName":"John", 
    "lastName":"Doe", 
    "email":"[email protected]", 
    "__v":0 
} 

正如預期的那樣。

因此,如果您的應用程序無法正常工作,那麼您要麼未按照自己的想法發送消息,要麼實際上在集合中存在值爲_id的字符串,或者它在集合或數據庫名稱中完全不匹配。所有的網址都應該有效,如果沒有網址,那麼後者就是這樣。

_id的是一個字符串的話,那麼該模式是錯誤的,需要是:

var personSchema = new Schema({ 
    _id: String 
    firstName: String, 
    lastName: String, 
    email: String 
},{ "_id": false }); 

其中最重要的是,除了在架構設置正確類型_id場也{ "_id": false }

這是因爲你需要這個來告訴貓鼬而不是試圖將「字符串」解析成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類型意味着被覆蓋。

+0

你自然是對的,身體分析器幫助放置和發佈請求,其中json數據是作爲req.body發送的。 –

+0

@PavelGatnar好,因爲POST數據是在「身體」,那麼你需要在這裏的東西,或手動處理。該請求位於URL中,因此可以隨時通過'req.params'進行訪問。代碼在這裏供人們重現。這裏也列出了可能失敗的原因(所有這些原因)。 –

+0

正如你所期望的那樣,當我打開/ people /時,這會返回正確的值,但我對此代碼有些不滿。我瞭解它是否正確,然後刪​​除所有內容,添加一行?因爲如果它沒有幫助。我需要/人/返回所有的值和/人/身份證/返回值ID:) – Andurit

-1

如果您已經從外部貓鼬填充數據庫,則有可能更改了_id屬性的類型。如果是這樣的情況下,嘗試將_id您schemma如下:

var personSchema = { 
    firstName:String, 
    lastName:String, 
    email:String, 
    _id:String 
} 
+0

嗯。'.findById()'是一個mong oose方法。 「人」模型已經明確定義。 –

+0

@BlakesSeven是的,根據開放性問題:*這應該返回一些我插入到mongo DB *的數據,這表明數據和Schema是手動創建的或由其他系統創建的。 –

+0

但你的「答案」?甚至沒有任何關係。在我和其他人低估這一點之前,我只是警告你。哦。貓鼬把「id」和「_id」當作同一件事。所以你顯然不知道這些材料,只是在網上搜索。大多數人可以做到這一點。只要你知道爲什麼downvotes發生。 –