簡體   English   中英

Node.js通過mongoDB中的ID查找結果

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM