簡體   English   中英

node.js應用程序-如何通過include連接到mongodb和“共享”連接?

[英]node.js application - how to connect to mongodb and “share” connection via an include?

背景資料

我正在嘗試我的第一個node.js API /應用程序。 作為一項學習練習,我試圖創建一些測試用例,首先刪除表中的所有記錄,插入3條特定記錄,然后查詢這3條記錄。

這是我拼湊的代碼:

http://pastebin.com/duQQu3fm

問題

從代碼中可以看到,我正在嘗試將數據庫連接邏輯放在dbSession.js文件中並傳遞它。

我可以通過執行以下操作來啟動http服務器:

dev@devbox:~/nimble_node$ sudo nodejs src/backend/index.js 
Server started and listening on port: 8080
Database connection successful

但是,當我嘗試運行茉莉花測試時,它失敗並顯示以下錯誤:

F

Failures:

  1) The API should respond to a GET request at /api/widgets/
   Message:
     TypeError: Object #<MongoClient> has no method 'collection'
   Stacktrace:
     TypeError: Object #<MongoClient> has no method 'collection'
    at resetDatabase (/home/dev/nimble_node/spec/resetDatabase.js:6:29)
    at /home/dev/nimble_node/spec/e2e/apiSpec.js:23:25
    at /home/dev/nimble_node/node_modules/async/lib/async.js:683:13
    at iterate (/home/dev/nimble_node/node_modules/async/lib/async.js:260:13)
    at async.forEachOfSeries.async.eachOfSeries (/home/dev/nimble_node/node_modules/async/lib/async.js:279:9)
    at _parallel (/home/dev/nimble_node/node_modules/async/lib/async.js:682:9)
    at Object.async.series (/home/dev/nimble_node/node_modules/async/lib/async.js:704:9)
    at null.<anonymous> (/home/dev/nimble_node/spec/e2e/apiSpec.js:19:9)
    at null.<anonymous> (/home/dev/nimble_node/node_modules/jasmine-node/lib/jasmine-node/async-callback.js:45:37)

Finished in 0.01 seconds
1 test, 1 assertion, 1 failure, 0 skipped


Database connection successful

resetDatabase的第6行是:

 var collection = dbSession.collection('widgets');

鑒於出現錯誤后,我收到“數據庫連接成功”消息,我認為發生的事情是,當測試請求dbSession庫時,數據庫尚未完成運行代碼的連接。 因此,我無法獲取集合對象。

我目前正在閱讀mongodb在線手冊,以了解是否可以找到有關如何執行此類操作的提示。 任何建議或指示,將不勝感激。

編輯1

為了證明MongoClient對象上有一個收集方法,我將dbSession.js代碼更改為如下所示:

'use strict';

var DBWrapper = require('mongodb').MongoClient;
var dbWrapper = new DBWrapper;
dbWrapper.connect("mongodb://localhost:27017/test", function(err, db) {
        if (!err) {
                console.log("Database connection successful");
                dbWrapper = db;
                var collection = dbWrapper.collection('widgets');
                console.log('just created a collection...');
        }
});
module.exports = dbWrapper;

現在,當我啟動http服務器(index.js)時,請注意以下消息:

dev@devbox:~/nimble_node$ sudo nodejs src/backend/index.js 
Server started and listening on port: 8080
Database connection successful
just created a collection...

這可能是一個異步問題。

您在dbSessionjs中的代碼

dbWrapper.connect("mongodb://localhost:27017/test", function(err, db) {
        if (!err) {
                console.log("Database connection successful");
                dbWrapper = db;
        }
});
module.exports = dbWrapper;

異步啟動dbWrapper的連接,但立即導出dbWrapper,然后將其導入resetDatabase中。 因此,是的,當您在resetDatabase中調用connect函數時,它可能尚未從異步函數返回(這是日志所建議的,因為錯誤出現在成功日志之前)。

您可以在dbWrapper.connect()返回之后添加一個回調,以便實際上只能在連接完成后使用dbWrapper。

(使用sqlite時,這可能不會發生,因為它可以在命令行上更快地訪問數據庫)。

這可能不是您的問題,但看起來像一個候選人。

編輯:這是回調的可能示例,但是請注意,這取決於您需要執行的操作,因此有很多不同的解決方案。 關鍵是在完成初始化后調用回調函數。

另一個解決方案可能是簡單地等待和/或輪詢(例如,將變量“初始化”)。

'use strict';

var DBWrapper = require('mongodb').MongoClient;
var dbWrapper = new DBWrapper;

function doConnect(callback) {
  console.log("Initializing DB connection...");
  dbWrapper.connect("mongodb://localhost:27017/test", function(err, db) {
        if (!err) {
                console.log("Database connection successful");
                dbWrapper = db; 
                var collection = dbWrapper.collection('widgets');
                console.log('just created a collection...');
                console.log('calling callback...');
                callback(dbWrapper);
        } else {
          console.log("Error connectingi: " + err);
        }
  }); 
};

doConnect(function(correctDbWrapper) {
    //Now you can use the wrapper
  console.log("Inside callback, now consuming the dbWrapper");
  dbWrapper = correctDbWrapper;
  var collection = dbWrapper.collection('widgets');
});

有趣的是,盡管我通常都使用過類似您的代碼,但我從未遇到過這個問題。 我猜是因為通常我在頂部有此數據庫初始化,然后必須在節點應用程序上進行大量初始化,這使應用程序有足夠的時間從連接調用中返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM