我正在尝试使用grunt任务将数据插入mongodb。 Init.js是位于“tasks”目录中的文件。所以,我将任务注册为:
grunt.registerTask('dbinit', function () {
grunt.task.loadTasks('tasks');
}
tasks目录有Init.js:
var mongoose = require('mongoose'),
config = require('/lib/config/config.js'),
mongoose = require('mongoose'),
dbmodel = require('/lib/models/user.js'),
db;
mongoose.connect(config.mongo.uri, config.mongo.options);
db = mongoose.connection;
db.on('open', function () {
var user = new dbmodel.User({
userId : 'bond007'
});
console.log('Adding seed user: '+user);
newUser.save(function (err, product, numberAffected) {
if (err) {
console.log(err);
} else {
console.log("saved user: "+user.userId);
}
db.close();
});
});
问题是从不调用Init.js。我不确定它是否是调用Init.js的异步问题或问题,但我看到“dbinit”任务“完成没有错误”。
答案 0 :(得分:0)
默认情况下,Grunt任务同步执行,任务完成,而不是等待mongoose连接打开。在任务中使用this.async()
让任务等待。
更好的策略可能是将tasks/Init.js
中的部分包装在类似的任务中:
var mongoose = require('mongoose'),
config = require('/lib/config/config.js'),
mongoose = require('mongoose'),
dbmodel = require('/lib/models/user.js'),
db;
grunt.registerTask('dbinit', function() {
var done = this.async();
mongoose.connect(config.mongo.uri, config.mongo.options);
db = mongoose.connection;
db.on('open', function () {
var user = new dbmodel.User({
userId : 'bond007'
});
console.log('Adding seed user: '+user);
newUser.save(function (err, product, numberAffected) {
if (err) {
console.log(err);
} else {
console.log("saved user: "+user.userId);
}
db.close();
done(); // Call done to close the task
});
});
});
然后在你的grunt文件中使用grunt.loadTasks('tasks');
。