0

我正在编写一个网站,发现这个奇怪的 [Error:Invalid ObjectId] 在我的 console.log 中打印出来,这是发生错误的情况:

1)当我重启节点服务器并重新登录时,在主页,没有这样的错误;但是一旦我第一次点击进入项目页面,我会得到一个

[Error: Invalid ObjectId]

我发现这个错误是由“/items/:id”控制器打印出来的;

我不断刷新页面,再也没有出现过

2) 发生此错误的另一种情况是当我什么都不做时,就像刚才一样,只输入stack-overflow,并且在一定时间内,我会再收到一个这样的错误。这个错误让我很困扰,因为如果我出去1~2个小时,我的开发服务器回来的时候可能会出现20个这样的错误,它会卡住并且没有很快响应(大约需要2分钟才能响应)

我正在使用 Jade、backbone.js、express.js 和猫鼬;但我没有使用像 socket.io 这样的东西,而且我相信我的骨干网在一定时间内也不会调用服务器。(除非我对骨干的了解是错误的。)

这是简化的代码:

1)我点击的链接:

a(href!="/items/<%=_id%>") click

2)产生此错误的控制器:

//GET an item
app.get('/items/:id',function(req,res){
    models.ItemModel.findOne({_id:req.params.id},function(err,item){
        if (!err){
            item.rtime=app.moment(item.ctime).fromNow();
            render(req,res,'item.jade',item)
        } else
            console.log(err)
    })
})

render函数是一个封装函数,索引页也使用了那个函数,没有报错,所以我觉得跟render()没有关系。

目前,我可以肯定的是,当第一次点击链接时,控制器肯定会被调用两次。第一次调用正常,返回页面,但第二次调用好像是空调用,返回一个空项。

有没有人以前有过这种类似的情况?或者关于如何解决这个问题的一些想法?

4

2 回答 2

1

我在 Chrome 中浏览时遇到了同样的问题。就我而言,似乎有一个插件(很可能是 UA spoofer)正在发出第二个请求。我验证了在 Safari 中该请求只被调用一次。尝试关闭浏览器中的所有插件或使用其他浏览器进行测试。

于 2013-06-11T15:20:15.877 回答
0

使用 {_id:req.params.id.toString()}

ObjectID 通常是一个对象,但 Mongoose 在搜索时需要一个字符串。将 toString() 添加到 ObjectIDs 和 Strings 使其安全。

于 2012-12-18T13:35:18.940 回答