MongoDB - findOne使用params id导致空对象或错误

时间:2016-08-21 21:20:44

标签: javascript node.js mongodb express

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

localhost:3000 / clients 呈现整个' 客户'

的集合

localhost:3000 / clients /:id 应按ID呈现特定客户

这是一个集合:来自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 的获取功能:

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 - 为什么它没有工作?

3 个答案:

答案 0 :(得分:0)

您需要使用对象:{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})
    }
  });
})

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

可能是这样的:

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