我知道这是之前提到过的一个主题,但是我正在使用reync.db和我正在使用as Error: Callback was already called
。奇怪的是,即使它抛出该错误并使应用程序崩溃,它仍然会创建我需要的数据库和表。我已经阅读了一些其他帖子,其中包含NodeJS Async: Callback already called?或Using async.waterfall等答案,但我似乎无法获得任何答案。我的控制台也告诉我错误在db.js:40:9
,但我是Node的新手,并且不确定它对回调的要求。我究竟做错了什么?我需要在这里嵌套我的回调吗?我正在使用的代码发布在下面。我非常感谢能得到的任何帮助,如果需要,我可以发布其他相关代码。谢谢你们。
db.js:
exports.setDatabaseAndTables = function() {
async.waterfall([
function connect(callback) {
r.connect(config.rethinkdb, callback);
},
function createDatabase(connection, callback) {
// Create the database if needed.
r.dbList().contains(config.rethinkdb.db).do(function(containsDb) {
return r.branch(
containsDb,
{created: 0},
r.dbCreate(config.rethinkdb.db)
);
}).run(connection, function(err) {
callback(err, connection);
});
},
function createTable(connection, callback) {
// Create the tables if needed.
r.tableList().contains('todos').do(function(containsTable) {
return r.branch(
containsTable,
{created: 0},
r.tableCreate('todos')
);
}).run(connection, function(err) {
callback(err, connection);
});
r.tableList().contains('users').do(function(containsTable) {
return r.branch(
containsTable,
{created: 0},
r.tableCreate('users')
);
}).run(connection, function(err) {
callback(err, connection);
});
},
function createIndex(connection, callback) {
// Create the indexes if needed.
r.table('todos').indexList().contains('createdAt').do(function(hasIndex) {
return r.branch(
hasIndex,
{created: 0},
r.table('todos').indexCreate('createdAt')
);
}).run(connection, function(err) {
callback(err, connection);
});
r.table('users').indexList().contains('createdAt').do(function(hasIndex) {
return r.branch(
hasIndex,
{created: 0},
r.table('users').indexCreate('createdAt')
);
}).run(connection, function(err) {
callback(err, connection);
});
},
function waitForIndex(connection, callback) {
// Wait for the index to be ready.
r.table('todos').indexWait('createdAt').run(connection, function(err, result) {
callback(err, connection);
});
r.table('users').indexWait('createdAt').run(connection, function(err, result) {
callback(err, connection);
});
}
],
function(err, connection) {
if(err) {
console.error(err);
process.exit(1);
return;
}
});
};
答案 0 :(得分:1)
对于那些尝试" async.waterfall"这是一个常见的问题。
这是通过拆分" createTable"," createIndex"和" waitForIndex"分为两个函数:
exports.setDatabaseAndTables = function() {
async.waterfall([
function connect(callback) {
r.connect(config.rethinkdb, callback);
},
function createDatabase(connection, callback) {
// Create the database if needed.
r.dbList().contains(config.rethinkdb.db).do(function(containsDb) {
return r.branch(
containsDb,
{created: 0},
r.dbCreate(config.rethinkdb.db)
);
}).run(connection, function(err) {
callback(err, connection);
});
},
function createTableTodos(connection, callback) {
// Create the tables if needed.
r.tableList().contains('todos').do(function(containsTable) {
return r.branch(
containsTable,
{created: 0},
r.tableCreate('todos')
);
}).run(connection, function(err) {
callback(err, connection);
});
},
function createTableUsers(connection, callback) {
r.tableList().contains('users').do(function(containsTable) {
return r.branch(
containsTable,
{created: 0},
r.tableCreate('users')
);
}).run(connection, function(err) {
callback(err, connection);
});
},
function createIndexTodos(connection, callback) {
// Create the indexes if needed.
r.table('todos').indexList().contains('createdAt').do(function(hasIndex) {
return r.branch(
hasIndex,
{created: 0},
r.table('todos').indexCreate('createdAt')
);
}).run(connection, function(err) {
callback(err, connection);
});
},
function createIndexUsers(connection, callback) {
r.table('users').indexList().contains('createdAt').do(function(hasIndex) {
return r.branch(
hasIndex,
{created: 0},
r.table('users').indexCreate('createdAt')
);
}).run(connection, function(err) {
callback(err, connection);
});
},
function waitForIndexTodos(connection, callback) {
// Wait for the index to be ready.
r.table('todos').indexWait('createdAt').run(connection, function(err, result) {
callback(err, connection);
});
},
function waitForIndexUsers(connection, callback) {
r.table('users').indexWait('createdAt').run(connection, function(err, result) {
callback(err, connection);
});
}
],
function(err, connection) {
if(err) {
console.error(err);
process.exit(1);
return;
}
});
};