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

时间:2015-09-08 23:44:32

标签: javascript angularjs mongodb express

我有一个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,但我也没有显示任何输出。

关于可能导致这种情况的任何想法?

1 个答案:

答案 0 :(得分:1)

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

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

  

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

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

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

注意mongodb://部分是强制性的,而端口号(默认值)之类的部分则不是。

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