Express.js&猫鼬查询问题

时间:2017-07-08 01:42:12

标签: node.js mongodb express mongoose

我正在尝试使用_id在MongoDB中查询单个文档。我使用的是Mongoose(版本:4.11.1)。当我尝试运行查询时,我将_id作为路由localhost:3000/poi/one/595ef9c8c4891179f8b4bbfb上的URL参数传递。

当我按Enter键时,浏览器将继续加载并永远不会完成。我能够在控制台中看到“获得一个POI”。但从来没有看到任何其他东西。

我正在使用mLab来托管我的数据库。里面只有一个文件。

mLab文件: jsperf.com

以下是我的查询代码:

let express = require('express');
let router = express.Router();

let {Poi} = require('../models/db-model');

router.get('/one/:id', (req, res, next) => {
    console.log('getting one POI');
    Poi.findOne({_id: req.params.id}).exec(function (err, poi) {
        if (err) {
            res.send('error occurred')
        }
        else {
            console.log(poi);
            res.send(poi)
        }
    });
});

我的数据库模型:

const mongoose = require('mongoose');

// point of interest schema
let poiSchema = mongoose.Schema({
    name: {
        type: String,
        required: true,
        minlength: 1,
        trim: true,
    },
    url: {
        type: String,
        required: true
    },
    address: {
        type: String,
        required: true
    },
    cost: {
        type: Number,
        required: false
    }
});

// instantiate models
let Poi = mongoose.model('Poi', poiSchema);

// export models
module.exports = {Poi};

我已经坚持这个问题好几个小时了,可能无法弄清问题是什么。

修改

Mongoose配置:

const mongoose = require('mongoose');
const config = require('../app-config.json');

mongoose.Promise = global.Promise;

// connect to mLab Collection
mongoose.connect(config.dbUri);

module.exports = {mongoose};

2 个答案:

答案 0 :(得分:0)

findOne的官方文档中,Mongoose建议在Model.findById()字段查询时使用_id方法。您可以在此处专门阅读findById的文档:http://mongoosejs.com/docs/api.html#model_Model.findById

基本上它看起来像是:

Poi.findById(req.params.id).exec(function (err, poi) {
  // ...

答案 1 :(得分:0)

你的问题的答案非常简单。

虽然req.params.idString,但它不等于mongo生成的ID。并且为了按ID进行查询,您必须将String转换为ObjectId,这可以通过多种方式完成。

如果你的模块中需要mongoose,你可以通过执行以下操作将字符串转换为对象id:mongoose.Types.ObjectId(req.params.id)然后你将你的id作为Object而不是字符串,你可以查询成功。