2017-07-08 107 views
0

我正在尝试使用_id来查询我的MongoDB中的单个文档。我正在使用Mongoose(版本:4.11.1)。当我尝试运行查询时,我通过_id作为路径localhost:3000/poi/one/595ef9c8c4891179f8b4bbfb上的URL参数。Express.js&Mongoose查询问题

当我按下回车键后,浏览器将继续加载并永不完成。我能够在控制台中看到“获取一个POI”。但从来没有看到别的。

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

MLAB文件: mLab Screenshot

这里是我的查询代码:

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}; 

我一直在坚持日现在几个小时都有问题,可能只是不知道问题是什么。

编辑:

猫鼬配置:

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}; 
+0

打开猫鼬调试,看看查询是否真正发出,以及实际发送给它的值。在服务器启动之前使用'mongoose.set('debug',true)'和mongoose.connect()'在同一个地方。关于这个问题,你是否最近可能因为弃用警告消息而改变了你的'mongoose.connect()'?因为很多人都在错误地改变这种改变,其结果是,由于未解决的回调正在等待,所以没有发出请求。 –

回答

0

在他们的findOne官方文档,猫鼬建议由_id现场查询时使用Model.findById()方法。您可以具体阅读文档findById这里:http://mongoosejs.com/docs/api.html#model_Model.findById

本质上,它看起来是这样的:

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

我给了那一枪。但它仍然继续从未完成请求,浏览器只是继续加载。 – kstullich

+0

@kstullich你可以发布你的配置是猫鼬?这可能在你的主/索引文件中,看起来像'mongoose.connect(...)'。默认情况下,mongoose缓冲区在内部建模函数调用,并且会挂起直到成功建立连接(显然这不会引发错误)。您也可以通过禁用架构上的缓冲区命令(以调试是否瓶颈)mongoose.Schema({...},{bufferCommands:false})来禁用此功能。 – Joey

+0

请查看我对我的配置所做的编辑。 – kstullich

0

回答你的问题很简单。

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

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

+0

只是给了一个镜头,它没有奏效。查询仍然不会执行,浏览器也不会完成加载。 – kstullich

+0

你需要在你的文件中的'猫鼬'? –

+0

是的我需要它 – kstullich