0

Webサイトをコーディングしていますが、この奇妙な[Error:Invalid ObjectId]がconsole.logに出力されていることがわかりました。これは、エラーが発生する状況です。

1)ノードサーバーを再起動して再度ログインすると、ホームページでそのようなエラーは発生しません。しかし、初めてアイテムページをクリックすると、

[Error: Invalid ObjectId]

このエラーは「/items/:id」コントローラーによって出力されることがわかりました。

私は絶えずページを更新しました、そしてそれは二度と起こりませんでした

2)このエラーが発生する別の状況は、今のように何もせず、スタックオーバーフローを入力するだけで、一定時間、このようなエラーがもう1つ発生する場合です。このエラーは気になりました。1〜2時間外出すると、開発サーバーに戻ったときにこのようなエラーが20回発生し、ジャムが発生して応答が遅くなるためです(応答に約2分かかります)。

私はJade、backbone.js、express.js、mongooseを使用しています。しかし、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()とは関係がないと思います。

現在、私が確信しているのは、リンクが最初にクリックされたときに、コントローラーが確実に2回呼び出されることです。最初の呼び出しは正常でページを返しますが、2番目の呼び出しは空の呼び出しのようで、nullアイテムを返します。

誰かが以前にこのような状況を経験したことがありますか?または、この問題を解決する方法についてのアイデアはありますか?

4

2 に答える 2

0

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

通常、ObjectID はオブジェクトですが、Mongoose は検索時に String を想定しています。ObjectID と String に toString() を追加すると安全になります。

于 2012-12-18T13:35:18.940 に答える