2017-09-16 63 views
0

這裏是我的架構/型號:爲什麼我無法使用此代碼推送Mongoose/Express中的數組?

var todoSchema = new mongoose.Schema({ 
    item: [String] 
}); 

這裏是put方法

app.put('/todo/:id', urlencodedParser, function(req, res) { 
    Todo.findByIdAndUpdate(req.params.id, 
     { "$push": { "item": req.body } }, 
     { "new": true, "upsert": true }, 
     function (err, data) { 
      if (err) throw err; 
      console.log(data); 
     } 
    ); 
}); 

什麼應該發生的是它抓住ID(:身份證),並發現該ID,並推動REQ .body(這是一個字符串,來自網頁的輸入)並將其推送到項目數組。

我收到以下錯誤,當這種放叫做:

CastError: Cast to ObjectId failed for value ":id" at path "_id" for model "Todo" 

這是奇怪的,因爲我沒有明確投的ID作爲的ObjectId當我使用findById()。

回答

0

代碼是正確的。我認爲可能是你的查詢ID是不是一個有效的objectId,以便它施放錯誤..它必須是12字節的字符串..檢查它?如果其正確的手段也檢查貓鼬版本,可能是這個問題..我安裝貓鼬版本4

+0

我已經得到它停止失敗時,我按下按鈕 - 但數據庫沒有得到串推到它(他們開始空,並保持爲空)。我在控制檯 – treo

+0

裏面沒有收到任何錯誤put方法打印查詢值..console.log(「req.query」,req.query),並檢查id值是否是像這樣的12個字節的字符串「59b67565c8745e27f9f3cf46」 – Dinesh

+0

我發現在put方法應該被調用時,把console.log實際上並不打印任何數據。 – treo

0

Mongoose的_id默認類型是ObjectId。這就是你將_id傳遞給字符串值的原因。

Mongoose的findByIdAndUpdate方法將id參數轉換爲模型的_id字段的類型,以便它可以正確查詢匹配的文檔。這是一個ObjectId,但「req.params.id」不是一個有效的ObjectId,因此投射失敗。

這不會發生在59b67565c8745e27f9f3cf46因爲該字符串是一個有效的ObjectId。解決這個

的一種方法是之前你findByIdAndUpdate通話添加一個檢查,看看是否ID是一個有效的ObjectId或不喜歡這樣:

if (req.params.id.match(/^[0-9a-fA-F]{24}$/)) { 
    // Yes, it's a valid ObjectId, proceed with `findById` call. 
} 

另一種方式來做到這一點,你可以解析字符串到的ObjectId,如:

ObjectId.fromString(req.params.id) 
相關問題