【问题标题】:MongoDB - findOne using the params id results in an empty object or an errorMongoDB - findOne 使用参数 id 导致空对象或错误
【发布时间】:2016-12-28 09:09:56
【问题描述】:

我正在通过构建一个简单的小应用程序来学习 Express/Mongo(使用 mLab),我可以创建一个客户列表和一个客户详细信息页面。

localhost:3000/clients 呈现 'clients' 的整个集合

localhost:3000/clients/:id 应该通过 id 呈现特定的客户端

这是一个集合:clients 来自 MongoDB (mLab) 的条目示例:

{
    "_id": {
        "$oid": "57ba01d3ab462a0aeec66646"
    },
    "name": "ClientName",
    "address": {
        "street": "StreetName",
        "city": "Cityname",
        "state": "Statename",
        "zip": "1234"
    },
    "createDate": {
        "$date": "2016-08-21T19:32:35.525Z"
    }
}

我在 /clients 页面上成功创建了一个 href,其 id 值链接到特定客户端:

<a href="/clients/<%= client._id %>"><%= client.name %></a>

正确的结果是:

http://localhost:3000/clients/57ba01d3ab462a0aeec66646

这是 /clients/:id 的 get 函数:

app.get('/clients/:id', (req, res) => {
  db.collection('clients').findOne(req.params.id, (err, result) => {
    if (err) {
      handleError(res, err.message, "Failed to get clients.");
    } else {
      console.log(result);
      res.render('client.ejs', {client: result})
    }
  });
})

点击链接会出现以下错误:

MongoError: 查询选择器必须是一个对象 Function.MongoError.create (/Users/username/Desktop/node/node_modules/mongodb-core/lib/error.js:31:11) 在 Collection.find [...]

我整个下午都在阅读和搜索,并尝试了很多不同的选项,例如:

我真的需要猫鼬吗?这似乎是 Mongo 的基础——为什么它不起作用?

【问题讨论】:

  • MongoDB $oid vs ObjectId的可能重复
  • 这可能是重复的,但由于我不知道我在做什么,所以我不熟悉关于该问题的查询是以 json 的形式:{ "_id": { "$in": [ { "$oid": "54651022bffebc03098b4567" }, { "$oid": "54651022bffebc03098b4568" } ] } }跨度>
  • 您的过滤条件应该是:{"_id": { "$oid": req.params.id}}。问题是您使用的是 $oid 而不是普通的普通 ObjectId
  • 它正在慢慢下沉:/。但是,当我添加您概述的内容时,我遇到了一个严重的错误:db.collection('clients').findOne({"_id": { "$oid": req.params.id}}, (err, result) =&gt; {[...]
  • ^ 结果为:{"error":"Failed to get clients."}

标签: javascript node.js mongodb express


【解决方案1】:

你需要使用一个对象:{id: req.params.id}

app.get('/clients/:id', (req, res) => {
  db.collection('clients').findOne({_id: req.params.id}, (err, result) => {
    if (err) {
      handleError(res, err.message, "Failed to get clients.");
    } else {
      console.log(result);
      res.render('client.ejs', {client: result})
    }
  });
})

【讨论】:

  • 我曾经遇到过这个问题,虽然它不再给我对象错误,但在尝试访问页面上的 client.name 时出现了另一个错误:&lt;%= client.name %&gt; 我得到的错误是:TypeError: client.ejs:16 14| 15| &gt;&gt; 16| &lt;%= client.name %&gt;
【解决方案2】:

你需要将 req.params.id 转换为 MongoObject 然后使用它:

var id = new ObjectID(req.params.id);

【讨论】:

  • 我试过这个,但我得到以下错误:ReferenceError: ObjectID is not defined
  • 你应该在使用它之前写这个 var ObjectID = require('mongodb').ObjectID;
【解决方案3】:

可能是这样的:

 db.collection('clients').findOne({"_id.$oid": req.params.id}, (err, result) =>

【讨论】:

    猜你喜欢
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 2011-09-27
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    相关资源
    最近更新 更多