2015-08-28 4 views
4

Я новичок в Node.js, так извините, если это действительно глупый вопрос, но как бы я ни старался, я не могу найти ответ.Node.js найти результат по ID от mongoDB

У меня есть простой код:

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, в то время как первый один/человек/правильно вернуть все (поясню просто вернуть дамп БД)

второй с идентификатором ничего не возвращает. Я пытаюсь отладить его, и я вижу, что внутри идентификатора функции определено правильно, я также использовал идентификатор, который поступает с сайта «people» (что-то вроде: 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 данные, используя ваше приложение и через mongoose или любым другим способом? –

ответ

3

Это время этот вопрос был развенчан, а сам я очень устал от ложных ответов здесь.

Код как единое целое. Единственные проблемы, которые могут возникнуть, - это то, что вы отправляете неправильные вещи или имеете неправильную коллекцию, а также последний вопрос относительно самого значения _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: "[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 URL вы получите:

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

в качестве ответа.

И когда вы звоните с идентификатором, как в /people/55e0464e66e13f6506e8e38e тогда вы получите:

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

Как и следовало ожидать.

Так что если ваше приложение не работает, то вы либо не отправляете то, что считаете себя, либо фактически имеете значение String для значения _id в коллекции, либо оно полностью несовместимо с именем коллекции или базы данных. Все URL-адреса должны работать, и если ни один из них не работает, последний имеет значение.

В случае _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 предназначен для переопределения.

+0

Вы, естественно, правы, тело-парсер помогали с постами и постами, где данные json были отправлены как req.body. –

+0

@PavelGatnar Ну, так как данные POST находятся в «теле», вам нужно что-то здесь или ручку. Этот запрос находится в URL-адресе и поэтому доступен 'req.params' все время. Код здесь для людей, чтобы воспроизвести. Здесь также перечислены причины возможного отказа (все они). –

+0

Как вы ожидаете, это вернет мне правильное значение, когда я открою/people /, но я немного согласен с этим кодом. Правильно ли я понимаю, что после этого вы удаляете все, добавьте одну строку? потому что, если да, это не помогает. Мне нужно/people/вернуть все значения и/people/id/return только значение с ID:) – Andurit

-1

Если вы заселили свою базу данных из-за пределов мангуста, есть шанс, что вы изменили тип имущества _id. Если это так, попробуйте добавить _id к вашим schemma следующим образом:

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

Umm. '.findById()' это mong oose. И модель «Личность» была четко определена. –

+0

@BlakesSeven Да, в соответствии с начальным вопросом: * Это должно возвращать некоторые данные, которые я вставляю в mongo DB *, который предполагает, что данные и схема создаются вручную или какой-либо другой системой. –

+0

Но ваш «ответ»? Даже не имеет к этому никакого отношения. Я просто предупреждал вас, прежде чем я и другие опустили это. Ой. И мангуста лечит «id» и «_id» как одно и то же. Таким образом, вы явно не знаете материал и просто ищете интернет. Большинство людей могут это сделать. Просто, чтобы вы знали, почему происходит downvotes. –

Смежные вопросы