调用collection.find()会导致内部服务器错误并在之后超时



我有一个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:datadb 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"。router.get()内部的console.log调用在控制台中没有显示输出。

这让我相信我不知何故没有连接到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(内部服务器错误)

奇怪的是:当我在一个try-catch块中包装db.collection()调用并尝试将错误记录到控制台时,它不再导致HTTP 500,但我也没有显示任何输出。

你知道是什么原因导致的吗?

不知道为什么这里没有看到错误记录,可能是因为您的应用程序中没有提到的其他配置。

但是你"应该"看到的错误是:

错误:URL格式必须为mongodb://user:pass@host:port/dbname

这是因为你的连接字符串不是驱动程序接受的有效格式。它应该是这样的:

var db = require('mongoskin').db('mongodb://localhost:27017/stackmailer');

注意mongodb://部分是强制性的,而像端口号这样的东西(这是默认的)不是。

我还会注意到,你似乎在你的"路由"模块中加载了这个,并且可能在你打算使用数据库连接的其他地方。强烈建议不要这样做,因为数据库连接应该在每个应用程序中建立一次,并且在需要使用它的地方"共享"连接。

相关内容

最新更新