2015-08-28 54 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发生。 –