我真的很喜欢 Aaron 的回答,多亏了他,我现在正在解决问题的路上......虽然我还没有到那里!这是我的特殊问题:
我想在单独的文件中定义我的模式和模型,这样我就可以在项目之间重用它们。例如,我有一个名为W8DBItem.js的文件,如下所示:
var mongoose = require('mongoose');
var itemSchema = new mongoose.Schema({ name: {type: String, required: true}});
module.exports = mongoose.model('W8DBItem', itemSchema);
在我的程序文件中,我这样做:
var mongoose = require('mongoose');
var W8DBItem = require('../w8/W8DBItem.js');
var dbURL ='mongodb://localhost:27017/default';
var mongoOptions = { useNewUrlParser: true, bufferCommands: false }
mongoose.connect(dbURL, mongoOptions);
var db = mongoose.connection;
// DEAL WITH CONNECTION ERROR
db.on('error', console.error.bind(console, 'connection error:'));
// PREP DATA
var aWeight = { name: "My Test Name" };
var newWeightItem = W8DBItem(aWeight);
// CONNECTION ESTABLISHED
db.once('open', function() {
console.log("Here 1")
// TRY TO SAVE
newWeightItem.save(function (err, newWeightItem) {
if (err) {
console.log("Here 2");
console.log(err);
}
else {
console.log("Here 3");
console.log(newWeightItem);
}
});
});
当我运行这个程序时,我在控制台中得到“Here 1”,但从来没有“Here 2”或“Here 3”。
从 Aaron 的帖子中,我了解到 W8DBItem 对象没有关联的(和打开的)连接,但我不确定如何解决问题。我可以连接到W8DBItem.js文件中的数据库,但我真的不喜欢使用对象对服务器信息进行硬编码——我希望这些对象用于不同的文件,并且可能用于不同的服务器。
非常感谢您的想法和建议!
[编辑:找到解决方案!!!]
我只导出模式,而不是从我的目标文件中导出我的 mongoose.model:
var mongoose = require('mongoose');
var itemSchema = new mongoose.Schema({name: {type: String, required: true}});
module.exports = itemSchema;
然后在我的程序文件中执行以下操作:
var itemSchema = require('../w8/W8DBItemSchema.js');
...
var W8DBItem = db.model('W8DBItem', itemSchema);
var newWeightItem = W8DBItem(aWeight);
...
奇迹般有效。我希望这可以帮助别人!