我有一个ExpressJS后端并添加了MongoDB。以前使用硬编码数据它工作得很好但是现在我已经(尝试)将MongoDB添加到管道中,我对数据的请求超时了。我使用命令提示符在集合中插入了一条记录:
> db
stackmailer
> db.sites.find()
{
"_id" : ObjectId("55ef5c1a7f6857848b7149b7"),
"title" : "Stack Overflow",
"icon" : "http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon.png"
}
MongoDB托管在localhost:27017
2015-09-08T23:58:51.394+0200 I CONTROL [initandlisten] MongoDB starting : pid=6836 port=27017 dbpath=C:\data\db\ 64-bit host=JEROEN-LAPTOP
2015-09-08T23:58:51.422+0200 I NETWORK [initandlisten] waiting for connections on port 27017
2015-09-08T23:58:54.760+0200 I NETWORK [initandlisten] connection accepted from 127.0.0.1:51658 #1 (1 connection now open)
我正在读这样的数据:
var db = require('mongoskin').db('localhost:27017/stackmailer');
router.get('/', function (req, res, next) {
db.collection('sites').find().toArray(function (err, result) {
if (err) {
console.log(err);
throw err;
}
console.log("found sites!");
console.log(result);
res.send(result);
});
}
这是从AngularJS调用的:
StackExchangeService.getSites().then(function(data) {
$scope.data.sites = data;
});
angular.module('StackMailer.Services', [])
.factory('StackExchangeService', function($q, $http) {
var service = {
getSites: function() {
return getData('/sites');
}
};
function getData(url)
{
var d = $q.defer();
$http.get(url, ({ timeout: 10000 }))
.then(function(response, status) {
console.log("successfully retrieved data");
d.resolve(response.data);
}, function(response, status) {
console.log("couldn't retrieve data " + status);
d.reject(response);
});
return d.promise;
};
return service;
});
在指定的超时范围之后,控制台中显示“无法检索数据0”。 console.log
内的router.get()
个调用都没有在控制台中显示输出。
这让我相信我在某种程度上没有连接到MongoDB,但据我所知,我已经为此设置了所有设置。
查看ExpressJS输出,我注意到以下输出(3个请求):
GET / 304 5.335 ms - -
GET /css/stackmailer.css 304 4.784 ms - -
GET /js/stackmailer.js 304 1.250 ms - -
GET /sites 500 479.902 ms - 1424
GET /tags 304 2.303 ms - -
GET /css/stackmailer.css 304 0.937 ms - -
GET / 304 1.028 ms - -
GET /css/stackmailer.css 304 1.231 ms - -
GET /js/stackmailer.js 304 1.608 ms - -
GET /tags 304 1.156 ms - -
GET /sites - - ms - -
GET / 304 2.988 ms - -
GET /css/stackmailer.css 304 4.508 ms - -
GET /js/stackmailer.js 304 2.022 ms - -
GET /tags 304 1.336 ms - -
GET /sites - - ms - -
注意第一个请求/sites
返回HTTP 500并随后超时。这反映在控制台日志中:
无法加载资源:服务器响应状态为500(内部服务器错误)
奇怪的是:当我将db.collection()
调用包装在try-catch块中并尝试将错误记录到控制台时,它不再导致HTTP 500,但我也没有显示任何输出。
关于可能导致这种情况的任何想法?
答案 0 :(得分:1)
不确定为什么你没有看到这里记录的错误,这可能是因为你的应用程序中没有提到的其他配置。
但是你应该看到的错误是:
错误:网址格式必须为mongodb:// user:pass @ host:port / dbname
这是因为您的连接字符串不是驱动程序接受的有效格式。它应该是这样的:
var db = require('mongoskin').db('mongodb://localhost:27017/stackmailer');
注意mongodb://
部分是强制性的,而端口号(默认值)之类的部分则不是。
我还会注意到,您似乎在“路由”模块中有此加载,并且可能是您打算使用数据库连接的其他任何地方。强烈建议不要这样做,因为每个应用程序应该建立一次数据库连接,并且需要使用连接“共享”。