如果rethinkdb中需要,请创建数据库

时间:2015-05-09 15:54:25

标签: javascript node.js rethinkdb

这是我与rethinkdb的第一次互动,看起来不错,但我遇到了一些问题...

想法很简单:如果尚未创建数据库,则创建数据库。

代码很简单,或者很好,代码的概念:

module.exports = function(r, config) {
  var connection = null;

  r.connect(config.rdb, function(err, conn) {
    if (err) throw err
      connection = conn;
  });

  r.dbList()
    .contains('semestres')
    .do(function(dbExists) {
      return r.branch(
        dbExists,
        { created: 0 },
        r.dbCreate('semestres')
      );
    })
    .run(connection, function(err) {
      if (err) throw err;
    });
};

因此,这只是创建一个连接并将连接指向变量,然后检查数据库是否" semestres"存在,如果它存在,它什么也不做,否则,创建它。

但不是,我在运行服务器时遇到此错误:

Unhandled rejection RqlDriverError: First argument to `run` must be an open connection.
    at new RqlDriverError (/home/nano/Dev/semestres/node_modules/rethinkdb/errors.js:14:13)
    at FunCall.TermBase.run (/home/nano/Dev/semestres/node_modules/rethinkdb/ast.js:129:29)
    at module.exports (/home/nano/Dev/semestres/config/database.js:20:6)
    at Object.<anonymous> (/home/nano/Dev/semestres/server.js:10:29)
    at Module._compile (module.js:428:26)
    at Object.Module._extensions..js (module.js:446:10)
    at Module.load (module.js:353:32)
    at Function.Module._load (module.js:308:12)
    at Function.Module.runMain (module.js:469:10)
    at startup (node.js:124:18)
    at node.js:882:3

那么,我如何在rethinkdb中进行这种类型的操作?

2 个答案:

答案 0 :(得分:7)

由于这是JavaScript且代码是异步的,因此您的dbList查询无法访问您的connection变量。您需要将dbList代码置于连接回调中。

module.exports = function(r, config) {
  var connection = null;

  r.connect(config.rdb, function(err, conn) {
    if (err) throw err
      connection = conn;
      r.dbList()
        .contains('semestres')
        .do(function(dbExists) {
          return r.branch(
            dbExists,
            { created: 0 },
            r.dbCreate('semestres')
          );
        })
        .run(connection, function(err) {
          if (err) throw err;
        });
    };
  });

这与RethinkDB本身无关,但与JavaScript的工作方式有关。

答案 1 :(得分:1)

我们知道JavaScript是异步的,更好地使用promises或回调

import r from 'rethinkdb'
import config from '../config/rethinkDb/dbConfig'
let c = (callback) => { r.connect(config, (err, conn) => { callback(conn) }) }

export function showMenu(callback) {
    c((conn) => {
        r.table('menus').run(conn, function(err, res) {
            if (err) throw err;
            res.toArray(function(err, result) {
                if (err) throw err;
                callback(result);
            });
        });
    })

}

export function showMenu(callback) {\....