Grunt任务不调用外部JavaScript任务

时间:2014-05-01 14:44:29

标签: javascript node.js mongoose gruntjs

我正在尝试使用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”任务“完成没有错误”。

1 个答案:

答案 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');