2017-06-22 69 views
0

Im做上的NodeJS和MongoDB,但即時通訊卡上的DELETE方法一個RESTful服務器中刪除,因爲我嘗試了req.body.listId鑄成時收到錯誤HTTP使用的NodeJS和MongoDB

"Argument passed in must be a single String of …modules\express\lib\router\index.js:174:3" 

的ObjectId。

這裏是我的代碼:

router.delete('/', function(req, res){ 
    var db = req.db; 
    var collection = db.get('listcollection'); 
    var oId = new ObjectId(req.body.listId); //The exception is here 

    collection.remove(
    { 
     "_id": oId 
    },function(err,doc){ 
     if (err) { 
      res.json("There was a problem deleting the information to the database."); 
     } 
     else { 
      res.json("Successfully deleted"); 
     } 
    } 
); 
}); 

解決!: 的listId參數被引述( 「58f8b2cc8cf726ca76551589」),所以我做了一個切片。無論如何,我改變了在URL中收到的參數,下面是代碼:謝謝!

router.delete('/:listId', function(req, res){ 
    var db = req.db; 
    var collection = db.get('listcollection'); 

    var listId = req.params.listId; 
    listId = listId.slice(1, listId.length - 1); 

    var oId = new ObjectId(listId); 

    collection.remove(
    { 
     "_id": oId 
    },function(err,doc){ 
     if (err) { 
      res.json("There was a problem deleting the information to the database."); 
     } 
     else { 
      res.json("Successfully deleted"); 
     } 
    } 
); 
}); 
+3

刪除方法的參數只能通過查詢字符串/ URL本身傳遞,而不是像post或put –

+1

您能告訴我們您的請求身體是什麼樣子嗎?你發佈了什麼?這聽起來像'req.body.listId'的內容違反了'ObjectId'的限制。此外,如前所述,在URL中指定id會更加RESTful,因此您的路由將變成'router('/:id')',然後您可以通過'req.params以快速方式訪問id。 id'。 – benjiman

+0

listId參數被引用(「58f8b2cc8cf726ca76551589」),所以我做了一個切片。無論如何,我改變了在URL中收到的參數。謝謝! –

回答

0

錯誤發生,因爲req.body.listId不遵循的ObjectId規則 - 的ObjectId是12個字節(24個0-9a-f字符,例如"507f1f77bcf86cd799439011")的字符串。可能出錯的是:

  • req.body.listId是一個普通數字,而不是字符串類型,例如, 89876
  • req.body.listId是一個字符串,但不遵循上述規則。

雖然不平安,與JSON身體HTTP請求DELETE是完全確定。 Node.js服務器可以接收請求及其正文。

+0

listId參數被引用(「58f8b2cc8cf726ca76551589」),所以我做了一個切片。無論如何,我改變了在URL中收到的參數。謝謝! –

+0

@FernandoPerez引用只是用來表示它是一個字符串類型:) – shaochuancs