【问题标题】:Mongoose: find statement not executingMongoose:find 语句未执行
【发布时间】:2018-01-05 02:45:04
【问题描述】:

进入这个路由器get函数,log语句打印到控制台,但是find语句好像没有执行。有什么明显的原因吗?

const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');

const Product = require('../models/product');

module.exports = router;

const url = "mongodb://xxxx@ds027425.mlab.com:xxxx/xxxx";

mongoose.Promise = global.Promise;
mongoose.createConnection(url, function(err) {
    if(err) {
        console.log('Error!!!' + err);
    } else {
        console.log('Connected to Database!');
    }
});

router.get('/product/specialvalue', function(req, res) {
    console.log('Get specialvalue called xxxx');

    Product.find({'special_value': true})
    .sort({'price': 1}) 
    .exec(function(err, products) {
        if(err) {
            console.error('Error retrieving special value products!');
            res.json(err);  
        } else {
            console.log("products = " + JSON.stringify(products));
           res.json(products);        
        }
    });

});

这是猫鼬模型:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const ProductSchema = new Schema({
  producttype: String,
  name: String,
  brand: String,
  model: String,
  price: Number,
  list_price: Number,
  description: String,
  rating: Number,

模型的延续:(系统迫使我添加更多细节)

  item_no: String,
  special_value: Boolean,
  warranty: String,
  feature: [String],
  image: [String],

模型的延续:

  specification: {
    lowes_exclusive : Boolean,
    color : String,
    high_efficiency : Boolean,
    automatic_load_balancing : Boolean,
    product_capacity : String,
    large_items_cycle : Boolean,

模型的延续:

        exclusive_cycle : String,
        maximum_spin_speed : String,
        water_levels : String,
        number_of_rinse_cycles : String
      }
    });

模型的延续:

var Product = mongoose.model('Product', ProductSchema, 'product');
module.exports=Product;

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    当您使用 .createConnection 而不是 .connect 时会有一些不同。

    下面是重构后的代码:

    const express = require('express');
    const router = express.Router();
    const mongoose = require('mongoose');
    const url = "mongodb://xxxx@ds027425.mlab.com:xxxx/xxxx";
    const Schema = mongoose.Schema;
    
    mongoose.Promise = global.Promise;
    
    
    const db = mongoose.createConnection(url, function(err) {
        if(err) {
            console.log('Error!!!' + err);
        } else {
            console.log('Connected to Database!');
        }
    });
    
    const ProductSchema = new Schema({
        producttype: String,
        name: String,
        brand: String,
        model: String,
        ...
        }
    });
    
    const Product = db.model('Product', ProductSchema);
    
    router.get('/product/specialvalue', function(req, res) {
        console.log('Get specialvalue called xxxx');
        Product.find({'special_value': true})
            .sort({'price': 1})
            .exec(function(err, products) {
                if(err) {
                    console.error('Error retrieving special value products!');
                    res.json(err);
                } else {
                    console.log("products = " + JSON.stringify(products));
                    res.json(products);
                }
            });
    
     });
    

    查看this post,了解如何使用 .createConnection

    【讨论】:

      【解决方案2】:

      您的问题在于您如何连接数据库。 mongoose.createConnection() 向数据库返回一个连接对象,但它没有将其设置为猫鼬的默认连接。 find 查询未执行的原因是因为 Mongoose 将所有 DB 调用排队并在处理它们之前等待有一个打开的连接,而不是在没有连接时抛出错误。使用mongoose.connect() 将解决您的问题。你可以在这里阅读它http://mongoosejs.com/docs/api.html#index_Mongoose-connect

      【讨论】:

      • 谢谢。像魅力一样工作。我以前使用过 mongoose.connect,但它告诉我它已被弃用并建议使用 mongoose.createConnection()。我将不得不加强这一点。
      猜你喜欢
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多