2017-02-28 135 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