Node.js RejectionDB未连接表单grunt任务

Node.js RejectionDB未连接表单grunt任务,node.js,gruntjs,rethinkdb,Node.js,Gruntjs,Rethinkdb,我创建了一个grunt任务来在数据库中创建表。 我面临的问题是,永远不会建立连接,也不会创建表。但是,如果我在为常规API端点提供服务时也这样做,那么一切都会按预期工作 下面是Gruntfile.js的摘录 'use strict'; var config = require(__dirname + '/config.js'); var r = require('rethinkdb'); module.exports = function (grunt) { grunt.register

我创建了一个grunt任务来在数据库中创建表。 我面临的问题是,永远不会建立连接,也不会创建表。但是,如果我在为常规API端点提供服务时也这样做,那么一切都会按预期工作

下面是Gruntfile.js的摘录

'use strict';

var config = require(__dirname + '/config.js');
var r = require('rethinkdb');

module.exports = function (grunt) {
  grunt.registerTask('createDatabases', 'Task to create rethinkDB tables', function () {
r.connect({
  host: config.rethinkDB.host,
  port: config.rethinkDB.port
}, function (err, conn) {
  if (err) throw err;
  r.db(config.rethinkDB.dbName).tableCreate('tv_shows').run(conn, function (err, res) {
    if (err) throw err;
    console.log(res);
    r.table('tv_shows').insert({name: 'Star Trek TNG'}).run(conn, function (err, res) {
      if (err) throw err;
      console.log(res);
    });
  });
});
  });
};

提前感谢

问题在于您的任务是异步的,但您将其视为异步任务。任务完成且流程存在,但您仍然没有创建表并执行
insert

您需要做的是在
registerTask
的正下方添加一行,创建一个
done
函数。然后,当您的流程实际完成时,您可以调用此
done
函数。如果您曾经使用过,您可能熟悉此模式

/*jshint node:true */
'use strict';

var config = {
  rethinkDB: {
    host: 'localhost',
    port: 28015,
    dbName: 'test'
  }
};

var r = require('rethinkdb');

module.exports = function (grunt) {
  grunt.registerTask('default', 'Task to create rethinkDB tables', function () {

    // 1. Declare your `done` function 
    var done = this.async();

    return r.connect({
      host: config.rethinkDB.host,
      port: config.rethinkDB.port
    }, function (err, conn) {
      if (err) throw err;
      return r.db(config.rethinkDB.dbName).tableCreate('tv_shows').run(conn, function (err, res) {
        if (err) throw err;
        console.log(res);
        return r.table('tv_shows').insert({name: 'Star Trek TNG'}).run(conn, function (err, res) {
          if (err) throw err;
          console.log(res);

          // 2. Call your `done` function once everything is done
          done();

        });
      });
    });
  });
};
你的代码还有一个bug。我想您将多次运行此操作,基本上,您希望确保这些表存在,但如果表存在,则不希望它抛出错误。默认情况下,如果您创建一个已经存在的表,则ReTimkDB会引发错误,因此您应该考虑这样做:

      return r.db(config.rethinkDB.dbName).tableCreate('tv_shows').run(conn, function (err, res) {
        // Don't throw an error or consider doing handling the error
        // if (err) throw err;
        console.log(res);
        // ...
承诺

你可以考虑通过使用承诺使这个代码更干净:

module.exports = function (grunt) {
  grunt.registerTask('default', 'Task to create rethinkDB tables', function () {
    var done = this.async();
    return r.connect({
      host: config.rethinkDB.host,
      port: config.rethinkDB.port
    })
    .then(function (conn) {
      return r.db(config.rethinkDB.dbName).tableCreate('tv_shows').run(conn)
        .catch(function () { })
        .then(function () {
          return r.table('tv_shows').insert({name: 'Star Trek TNG'}).run(conn);
        });
    })
    .then(done);
  });
};

非常感谢您的详细回答,我熟悉mocha,完全熟悉它们的异步特性,但对grunt自定义任务不太熟悉,再次感谢