2014-02-06 44 views
0

還沒有在Node/Mongoose中體驗過。Mongoose將變量定義爲數字,但req.query中的值用引號引起來。我該如何處理?

鑑於瀏覽器這樣的查詢:

www.example.com/systems?properties.max_diameter=24 

和貓鼬架構是:

var SystemSchema = new Schema({ 
    .... 
    properties:  { 
     max_diameter: { type: Number, required: true} 
    } 
}); 

module.exports = mongoose.model('System', SystemSchema); 

使用的console.log(req.query),我所知道的節點控制器看到:

req.query = { 'properties.max_diameter': '24' } 

請注意,值是用單引號引起來的。

因此,查詢失敗:

System.find(req.query).sort(sort_param).find(function(err, systems) {   
    res.send(systems); 
}); 

但是,如果我硬編碼的價值,使我有這樣的:

System.find({'properties.max_diameter': 24}).sort(sort_param).find(function(err, systems) {   
    res.send(systems); 
}); 

它完美的罰款。

當然,刪除引號很容易,但我不可能知道將使用的各種查詢組合。我認爲貓鼬會以某種方式處理這個問題,但我無法弄清楚我錯過了什麼或者做錯了什麼。

在此先感謝您的幫助。

乾杯。

+0

Mongoose會根據模式定義爲您進行此類轉換。這裏還有其他事情要做。 – JohnnyHK

+0

你應該使用'exec'而不是第二個'find',但這只是一個方面,因爲它對我來說都是有效的。 – JohnnyHK

+0

JohnnyHK - 你有這方面演員的例子嗎?我可以找到驗證檢查的例子等,或者保存,但不是用於投射req.query。必須有一個優雅的方式來處理這個問題。 – Eric

回答

0

正如我確信你知道的那樣,請求會以HTTP請求正文中的一個字符串的形式出現。這意味着在提交給Mongoose之前,您需要將數字的字符串表示形式轉換爲數字對象。我可以理解爲什麼你會覺得Mongoose會自動執行此操作,但我可以想到幾個需要相反效果的用例。儘管大多數項目都使用Mongoose和HTTP服務器,但您可以使用Mongoose編寫其他類型的應用程序。

要解決該問題,只需在路徑中使用parseInt()即可轉換爲數字對象,然後再使用req.query對象進行搜索。

req.body.max_diameter = parseInt(req.max_diameter); 

System.find(req.query).sort(sort_param).find(function(err, systems) {   
    res.send(systems); 
}); 

您還可以設置一箇中間件函數來爲您處理這個問題。

相關問題