首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用rethinkdb在koa中执行初始设置

如何使用rethinkdb在koa中执行初始设置
EN

Stack Overflow用户
提问于 2015-09-29 18:39:20
回答 1查看 239关注 0票数 0

我使用rethinkdbdash the,并试图找出如何在应用程序第一次启动时执行数据库的设置。我试图完成类似于Segphalt的猫的instagram教程,但使用koa。

代码语言:javascript
复制
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);
  });

我尝试过放弃,而不是将承诺链接起来,但这会引发错误,原因是语法无效。

代码语言:javascript
复制
 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()的查询,这样它只能在服务器启动时执行,而不是在每个请求周期中执行。还是有更好的方法在考拉完成这一任务?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-29 19:13:31

您只能在生成器函数(签名中带有星号的函数)中使用yield关键字。通常,如果您想使用yield等待承诺的完成,您将使用基于生成器的协同线包装整个操作集。

有两个库可用于此:

Co是Koa在其所有中间件处理程序中使用的内容,但我个人更喜欢Bluebird,因为在我的经验中,它似乎有更好的错误处理。

您可以将设置代码包装在Bluebird协同线中,然后将其称为就位:

代码语言:javascript
复制
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);
  }
})();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32851452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档