提问者:小点点

单独模块中的节点js数据库连接


我制作了包含一些REST服务的Node.js应用程序。这些服务连接到数据库(例如Oracle或DB2)以执行某些查询。

由于我是Node.js编程的初学者,我有一个关于我的案例的问题:什么是访问数据库的正确方式?在应用程序运行时有一个连接引用并在调用REST服务时使用相同的连接实例是否更好?

我发现了一些例子,它们在一个单独的模块中包含数据库连接,并在app中使用该模块,类似于:

db2.js:

var db2 = require('ibm_db');

var db2ConnSettings = "DRIVER={DB2};DATABASE=mydb;HOSTNAME=localhost;UID=db2test;PWD=db2test;PORT=50000;PROTOCOL=TCPIP";

var db2Conn = db2.open(db2ConnSettings, function(err, conn) {
        if (err)
            return console.log(err);
    });

module.exports = db2Conn;

server.js:

var express = require('express');
var app = express();
var db2Connection = require('./db2.js');

app.get('/data', function(req, res) {
    console.log(db2Connection );
    // make some query
});

当调用此服务时,db2connectionundefined。怎么会?我应该如何从db2.js文件中检索db2连接?


共2个答案

匿名用户

正如@Sirko所说:

var db2 = require('ibm_db');
var db2ConnSettings = "DRIVER={DB2};DATABASE=mydb;HOSTNAME=localhost;UID=db2test;PWD=db2test;PORT=50000;PROTOCOL=TCPIP";

var err, conn;
var callbacks = [];

module.exports = function(callback) {
  // db2 module is called

  if (err || conn) {
    // connection has already been established
    //   (results of db2.open have been stored)
    // callback immediately
    callback(err, conn);
  }
  else {
    // connection has not been established
    // store the callback for when db connects
    callbacks.push(callback);
  }
};

db2.open(db2ConnSettings, function(_err, _conn){
  // db has connected

  err = _err; conn = _conn; // store results
  var next_callback;

  // array.pop() removed the last item from the array
  // and returns it. if no items are left, returns null.
  // so this loops through all stored callbacks.
  while(next_callback = callbacks.pop()) {
    // the removed item is stored in next_callback
    next_callback(err, conn); // send connection results to callback
  }

  // no more items in callbacks to trigger
});
var express = require('express');
var app = express();
var db2Connection = require('./db2.js')(function(err, conn) {
  // triggered if the connection has already been established
  // or as soon as it HAS been established
  app.get('/data', function(req, res) {
      console.log(conn);
      // ...
  });
});

匿名用户

对于带有node-oracledb的Oracle,创建和使用连接池非常简单。您的应用程序只要处理HTTP REST请求,就会从池中获得一个免费连接。查看示例中的webapp.jswebapporations.js。Node-oracledb有一个“连接池队列”(请参阅doc),用于处理连接负载峰值。它还有一个“连接池缓存”(也请参阅文档),这使得访问在不同模块中创建的池变得容易。