2014-03-19 13 views
1

只是一個菜鳥的問題:的Node.js,Express和貓鼬,不確定的數據

我試圖使用屬性「蓋」刪除與該集合文件,但問題是,它顯示爲「不確定」。有沒有人有這樣的問題?謝謝 !!!

這裏是我的日誌:

完整的結果 - {__v:0, _id:5329a730e4b6306a08297318,

公司: 'ASD',

: '44f4a87035bd22c1995dcf0ab8af05b0',

描述:'asd',

類型: 'ASD',

名稱: 'ASD'}

結果COVER - 未定義

這裏是我的代碼:

exports.delete = function(req,res){ 

if(!req.session.authorized){ 
    res.json(403,{message:'YOU MUST BE LOGGED IN'}); 
    return; 
} 


Product.find({_id:req.params.id}, function(err,result){ 

    if (err){ 
     res.json(401, {message: err}); 

    }else{ 
     console.log("FULL RESULT - " + result); 
     console.log("RESULT COVER - " + result.cover); 

     var prodCoverName = result.cover; 

     if (prodCoverName){ 

      fs.exists('public/productAssets/'+ prodCoverName, function (exists) { 
       console.log('EXIST - public/productAssets/'+ prodCoverName); 
       fs.unlink('public/productAssets/'+ prodCoverName, function (err) { 

        if (err) throw err; 
        console.log('DELETED AT public/productAssets/'+ prodCoverName); 

       }); 

      }); 

     } 

    } 

}); 

Product.findOneAndRemove({_id:req.params.id}, function(err,result){ 

    if (err) res.json(401, {message: err}); 
    else res.json(200, {message: result}); 

}); 

};

回答

2

我不是貓鼬的專家,但我的猜測是,Product.find功能,將調用它的回調函數的文檔的陣列,而不是一個單一的文件,所以你應該用下面的更改代碼:

Product.find({_id:req.params.id}, function(err, results){ 
    var result = results[0]; // either one result or nothing, because id is unique and we want the first result only. 

或者使用findOne,而不是(與第一個結果這一個回調,更快):

Product.findOne({_id:req.params.id}, function(err, result){ 

或者使用findById(更短更快):

Product.findById(req.params.id, function(err, result){ 

現在你可能會問,爲什麼在我的情況下,FULL RESULT是一個對象。以下是javascript中發生的事情:

您有console.log("FULL RESULT - " + result),這裏您記錄了一個字符串,並且您在字符串和數組之間進行了字符串連接操作。當你試圖用非字符串連接一個字符串時,javascript試圖強制它變成一個字符串,所以在它不是undefined/null的情況下,它會調用.toString方法的值。 .toString數組的方法實際上是return this.join(',')join方法也是一個字符串連接。該數組包含文檔,因此JavaScript會嘗試將文檔轉換爲字符串(實際上它們是對象),並調用document.toString()。這是通過貓鼬實現的返回對象屬性,應該類似於util.inpsect(document);。這個事件的另一個例子是從'result is ' + [1]獲得result is 1

爲了避免這個問題,我建議,避免用字符串連接對象。而不是console.log('result is ' + object)嘗試做console.log(object)console('result is', object)

更新:

我才意識到你也是在你調用find同時調用findOneAndRemove,這是一個競爭條件。可能會發生.find調用不會發現任何內容,因爲.findOneAndRemove可能已經完成。這可能會帶來更多問題。

+0

我改變了Product.findById(req.params.id,function(err,result){正如你所說的......它現在工作完美....我會盡量只打一個電話給以避免將來的問題..謝謝你的解釋!!非常感謝!非常感謝!!! XD – rihurla

+1

歡迎您,今後儘量不要將字符串與對象連接起來,以免再次發生混淆。 –

+0

當然.. 。 謝謝 !! – rihurla