rethinkdb 不连接表单 grunt 任务
rethinkdb does not connect form grunt task
我创建了一个繁重的任务来在 rethinkDB 数据库中创建表。
我面临的问题是连接永远不会建立,也不会创建任何表,但是如果我在服务常规 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);
});
});
});
});
};
提前致谢
问题是您的任务是异步的,但您将其视为异步任务。您的任务完成并且您的流程存在,但您仍然没有创建您的 table 并执行您的 insert
。
您需要做的是在 registerTask
下面添加一行,创建一个 done
函数。然后你可以在你的过程实际完成时调用这个 done
函数。如果您曾经使用过 mocha,您可能会熟悉这种模式。
/*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();
});
});
});
});
};
您的代码确实还有一个错误。我想你会 运行 多次,基本上,你想确保这些 table 存在,但不希望它在 table 存在时抛出错误。默认情况下,RethinkDB 会在您创建一个已经存在的 table 时抛出错误,因此您应该考虑这样做:
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);
// ...
承诺
您可以考虑使用 promises 使这段代码更简洁:
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);
});
};
我创建了一个繁重的任务来在 rethinkDB 数据库中创建表。 我面临的问题是连接永远不会建立,也不会创建任何表,但是如果我在服务常规 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);
});
});
});
});
};
提前致谢
问题是您的任务是异步的,但您将其视为异步任务。您的任务完成并且您的流程存在,但您仍然没有创建您的 table 并执行您的 insert
。
您需要做的是在 registerTask
下面添加一行,创建一个 done
函数。然后你可以在你的过程实际完成时调用这个 done
函数。如果您曾经使用过 mocha,您可能会熟悉这种模式。
/*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();
});
});
});
});
};
您的代码确实还有一个错误。我想你会 运行 多次,基本上,你想确保这些 table 存在,但不希望它在 table 存在时抛出错误。默认情况下,RethinkDB 会在您创建一个已经存在的 table 时抛出错误,因此您应该考虑这样做:
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);
// ...
承诺
您可以考虑使用 promises 使这段代码更简洁:
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);
});
};