从数据库中获取后需要mongoose单例

时间:2016-04-23 08:29:05

标签: node.js mongodb express mongoose require

我正在尝试使用mongoose构建一个单例来将我的app配置存储在数据库中,因此不是构建模式和模型,而是使用module.exports导出后者,而不是获取配置然后导出它,但我得到的只是一个空的JSON。

这是我的配置模型代码:

var mongoose = require('mongoose');

var configSchema = new mongoose.Schema({
  ad: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Ad'
  },
  max_users: Number
});

var configModel = mongoose.model('Config', configSchema);

configModel.findOne()
  .populate('ad')
  .exec((error, result) => {
    if (!error) {
      if (result) {
        module.exports = result;
      } else {
        var default_config = new configModel({
          ad: null,
          max_users: 100
        });
        default_config.save();
        module.exports = default_config;
      }
    } else {
      throw error;
    }
  });

在路线中,我只需要文件并在路线中使用

var config = require('../models/config');

router.get('/', function(req, res, next) {
  res.json(config);
}

请注意,动态要求路径范围内的模块没有产生问题。

是因为require无法识别异步任务中的导出变量吗?有没有正确的方法来处理这个问题?

1 个答案:

答案 0 :(得分:1)

CommonJS中的

module.exports是同步的。尝试定义一个没有特定{}的文件,并在另一个文件中要求它会给你一个var mongoose = require('mongoose'); var configSchema = new mongoose.Schema({ ad: { type: mongoose.Schema.Types.ObjectId, ref: 'Ad' }, max_users: Number }); var configModel = mongoose.model('Config', configSchema); module.exports = function (cb) { configModel.findOne() .populate('ad') .exec((error, result) => { if (!error) { if (result) { module.exports = result; } else { var default_config = new configModel({ ad: null, max_users: 100 }); default_config.save(); cb(null, default_config); module.exports = default_config; } } else { cb(error); //throw error; } }); } // In your routes var config = require('../models/config'); router.get('/', function(req, res, next) { config(function(err, val) { if (err) { // send back error } else { res.json(val); } }) }

以下可能有用。

TokenStreamComponents