如何使用 rethinkdb 在 koa 中执行初始设置
How to perform initial setup in koa with rethinkdb
我正在将 rethinkdbdash 与 koa 一起使用,并试图弄清楚如何在应用程序首次启动时执行数据库设置。我正在尝试完成类似于 Segphalt 的 cats of instagram 教程但使用 koa 的东西。
var conn;
r.connect(config.database).then(function(c) {
conn = c;
return r.dbCreate(config.database.db).run(conn);
})
.then(function() {
return r.tableCreate("instacat").run(conn);
})
.then(function() {
return q.all([
r.table("instacat").indexCreate("time").run(conn),
r.table("instacat").indexCreate("place", {geo: true}).run(conn)
]);
})
.error(function(err) {
if (err.msg.indexOf("already exists") == -1)
console.log(err);
})
.finally(function() {
r.table("instacat").changes().run(conn)
.then(function(cursor) {
cursor.each(function(err, item) {
if (item && item.new_val)
io.sockets.emit("cat", item.new_val);
});
})
.error(function(err) {
console.log("Error:", err);
});
我试过只让步而不是链接承诺,但由于语法无效而引发错误。
try {
yield r.dbCreate(config.database.db).run();
yield r.tableCreate('user').run();
}
catch (err) {
if (err.message.indexOf("already exists") == -1)
console.log(err.message);
}
app.listen(port);
执行此类设置的最佳方法是什么,包括执行在 koa 中运行 .changes() 的查询,以便它仅在服务器启动后执行,而不是在每个请求周期执行。或者有没有更好的方法在 koa 中完成这个?
您只能在生成器函数(签名中带有星号的函数)中使用 yield
关键字。通常,如果您想使用 yield
来等待承诺的完成,您可以使用基于生成器的协程包装整个操作集。
您可以使用两个库:
Co 是 Koa 在其所有中间件处理程序中使用的引擎盖,但我个人更喜欢 Bluebird,因为根据我的经验,它似乎具有更好的错误处理能力。
您可以将设置代码包装在 Bluebird 协程中,然后就地调用它:
bluebird.coroutine(function *() {
try {
yield r.dbCreate(config.database.db).run();
yield r.tableCreate('user').run();
}
catch (err) {
if (err.message.indexOf("already exists") == -1)
console.log(err.message);
}
})();
我正在将 rethinkdbdash 与 koa 一起使用,并试图弄清楚如何在应用程序首次启动时执行数据库设置。我正在尝试完成类似于 Segphalt 的 cats of instagram 教程但使用 koa 的东西。
var conn;
r.connect(config.database).then(function(c) {
conn = c;
return r.dbCreate(config.database.db).run(conn);
})
.then(function() {
return r.tableCreate("instacat").run(conn);
})
.then(function() {
return q.all([
r.table("instacat").indexCreate("time").run(conn),
r.table("instacat").indexCreate("place", {geo: true}).run(conn)
]);
})
.error(function(err) {
if (err.msg.indexOf("already exists") == -1)
console.log(err);
})
.finally(function() {
r.table("instacat").changes().run(conn)
.then(function(cursor) {
cursor.each(function(err, item) {
if (item && item.new_val)
io.sockets.emit("cat", item.new_val);
});
})
.error(function(err) {
console.log("Error:", err);
});
我试过只让步而不是链接承诺,但由于语法无效而引发错误。
try {
yield r.dbCreate(config.database.db).run();
yield r.tableCreate('user').run();
}
catch (err) {
if (err.message.indexOf("already exists") == -1)
console.log(err.message);
}
app.listen(port);
执行此类设置的最佳方法是什么,包括执行在 koa 中运行 .changes() 的查询,以便它仅在服务器启动后执行,而不是在每个请求周期执行。或者有没有更好的方法在 koa 中完成这个?
您只能在生成器函数(签名中带有星号的函数)中使用 yield
关键字。通常,如果您想使用 yield
来等待承诺的完成,您可以使用基于生成器的协程包装整个操作集。
您可以使用两个库:
Co 是 Koa 在其所有中间件处理程序中使用的引擎盖,但我个人更喜欢 Bluebird,因为根据我的经验,它似乎具有更好的错误处理能力。
您可以将设置代码包装在 Bluebird 协程中,然后就地调用它:
bluebird.coroutine(function *() {
try {
yield r.dbCreate(config.database.db).run();
yield r.tableCreate('user').run();
}
catch (err) {
if (err.message.indexOf("already exists") == -1)
console.log(err.message);
}
})();