mongodb get / post挂起(或者看起来很慢)

时间:2015-11-28 06:27:30

标签: mongodb express mongoose

我继续在mongoose / mongodb / express / node应用程序上猛烈抨击。今天,它是最终的慢速笼子比赛。我们说蜗牛会因为这么慢而感到羞耻。我已经看过触及缓慢/悬挂的mongodb答案,但是与我的情况相比,这些例子都是大量的或者非常复杂。这可能意味着我错过了一些非常简单的东西来修复它。我只是不知道是什么。

我有三个集合,其中没有一个集合超过100个。最大的集合有200多个变量。我通过基本的html表单从用户那里获取值,并将其全部作为put:

提交
    router.route('/items/:user_id/:item_id')
        // update 
        .put(function(req, res) {
            var item = req.body;
            var id = req.params.item_id;
            Items.update({_id: id}, item, function(err, item) {
                if (err)
                    res.send(err);
            });
        }) 

完成后,我将用户重新路由到显示整个文件的页面,并通过上面的内容后立即继续填充:

        // view
        .get(function(req, res) {
            var id = req.params.item_id;
            Items.find({'_id':id},function(err, item) {
                if (err)
                    res.json(err);
                res.send(item);
            });
        })

但不像你期望的微型数据库和微小的更新(相对而言)那样好而且快速,它可能会令人憎恶。当我查看Chrome中的“网络”标签时,它表示PUT已停止,甚至没有表示完成。紧随其后的GET也会挂起,大约20秒,然后(最后!)页面会填充更新的信息。

(好吧,有时候。有很多次看起来PUT从未经历过,所以GET显示未改变的信息.Argh。)

我确实遇到过一个教程,说res.send包含一个res.end,所以你不必两次,但唯一的res.send是否有错误。我尝试添加res.end()作为每个中的最后一位,但后来我收到错误,说我发送后无法写入标题。但我一般的怀疑是,我需要一些东西告诉PUT它已经完成了。

PUT没有正式结束的问题,如果是,我添加什么才能使它不是错误而只是结束?或者我应该在路由器路由底部的PUT和GET后执行单个res.end()吗?或者我应该将两个分成单独的router.route调用?或者我应该在模型中跟踪的项目数量有限制吗?我不知道,所以我把自己置于mongo / mongoose神的怜悯之中。

提前多多感谢!

1 个答案:

答案 0 :(得分:2)

你是关于PUT命令没有终止的正确轨道。发生的事情是代码正在处理put,并且在成功之后它运行回调。但是它只有代码来处理错误,这就是你看到挂起的原因。

router.route('/items/:user_id/:item_id')
    // update 
    .put(function(req, res) {
        var item = req.body;
        var id = req.params.item_id;
        Items.update({_id: id}, item, function(err, item) {
            if (err)
                **return** res.send(err);
            **res.status(200).end();**
        });
    })

在获取方面,您肯定会对当前代码提出疑问,因为您有两个一个接一个地发送

    .get(function(req, res) {
        var id = req.params.item_id;
        Items.find({'_id':id},function(err, item) {
            if (err)
                **return** res.json(err);
            res.send(item);
        });
    })