我正在尝试使用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
无法识别异步任务中的导出变量吗?有没有正确的方法来处理这个问题?
答案 0 :(得分:1)
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