2017-02-28 176 views
1

我正在使用node-run-cmd包在我的app.js文件中啓動mongodb服務器。我知道這是有效的,因爲我可以在腳本運行時看到Robomongo上的集合以及正在運行的進程列表中的mongod.exe。問題是試圖連接到名爲testDB的數據庫。以下是註釋的代碼。連接到mongodb時出錯

//start mongodb server 
//this works 
var nrc = require('node-run-cmd'); 
var cmd = '..\\mongodb\\mongod --dbpath '+__dirname+'\\db'; 
nrc.run(cmd); 

//setup 
var express = require('express'); 
var MongoClient = require('mongodb').MongoClient; 
var app = express(); 
app.use(express.static('public')); 
app.set('view engine', 'ejs'); 

//connect to mongo 
//this fails to connect to db testDB 
var url = 'mongodb://localhost:27017/testDB'; 
MongoClient.connect(url, function(err, db) { 
    if(!err) { 
     console.log("connection successful"); 
    } 
    else{ 
     console.log(err.message) 
    } 
}); 

這裏是err.message

failed to connect to server [localhost:27017] on first connect 

任何想法,我做錯了這裏。我的假設是db連接在服務器完全啓動之前嘗試,但我不完全確定。

編輯:

所以這是什麼東西,時機的問題。我嘗試了以下,並連接到數據庫。除了我在這裏以外,是否有這樣的優雅方式?

function connect(){ 
    var url = 'mongodb://localhost:27017/testDB'; 
    MongoClient.connect(url, function(err, db) { 
     if (!err) { 
     console.log("connection successful"); 
     } 
     else { 
     console.log(err.message) 
     } 

    }); 
} 
setTimeout(connect, 10000); 
+0

檢查您的mongodb服務器是否正在運行 – georoot

+0

它正在運行根據進程列表和robomongo – bvmcode

+0

好吧,所以我認爲現在我得到了您的問題正確...延遲連接幾秒鐘。這是因爲mongod是守護進程。它不是以一個套接字來開始接受需要一段時間的連接。另外,由於作爲守護進程,父進程將在完成數據庫引導之前關閉。順便說一句,正確的方法是始終保持數據庫運行 – georoot

回答

2

你應該在node_run_cmd包(https://www.npmjs.com/package/node-run-cmd#callback-style)使用回調。

將您的連接功能放在回調中。

你可能也只想在這裏開始表達。

+0

實際上,它不起作用。服務器正在啓動不會被認爲是我相信 – bvmcode

+0

哦,你是對的。 node-run-cmd可能會在它從mongod.exe獲得良好狀態後立即返回,但它尚未偵聽連接。 可能有一個npm模塊用於在端口可用時提醒您,但您也可以使用setInterval嘗試連接每500毫秒。 – Chris