我继续在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神的怜悯之中。
提前多多感谢!
答案 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);
});
})