2017-01-31 70 views
0

這可能有點難以解釋,所以我會盡可能清楚。req.params在mongo查詢中不起作用

const express = require("express"); 
const router = express.Router(); 
const mongo = require("mongodb"); 
const linkId = require("./newRoute"); 

const DBusername = process.env.username; 
const DBpassword = process.env.password; 

const numbersOnly = new RegExp('^[0-9]+$'); 

var linkArr = []; 

router.get("/:url", function (req, res) { 
    if (numbersOnly.test(req.params.url)) { 
     mongo.MongoClient.connect(mongoUrl, function (err, db) { 
      if (err) throw err; 
      console.log("connection established") 
      var cursor = db.collection("urls").find({ "id":linkId.id}); 
      cursor.forEach(function (doc, err) { 
       if (err) throw err; 
       linkArr[0] = doc.href; 
      }, function() { 
       db.close(); 
       res.redirect(linkArr[0]) 
      }) 
     }) 
    } else { 
     res.json({ "error": "This url is not on the database." }) 
    } 
}); 

我想查詢與身份證號碼,這將有相應的網址作出反應,並重定向到URL數據庫。該數據庫填充了URL和它們各自的ID號碼。正如你可以看到下面的代碼將查詢數據庫這一行:

var cursor = db.collection("urls").find({ "id":linkId.id}); 

linkId.id是從另一個文件導入最近插入的URL的ID。一切都很完美。但是,如果我用這個行:

var cursor = db.collection("urls").find({ "id":req.params.url}); 

光標forEach永遠不會被執行,我有機會獲得req.params.url,所以我沒有得到任何錯誤。我不想從另一個文件中導入id,我希望從req.params.url中提取id(用於查詢數據庫)。爲什麼這不起作用,這讓我難以理解。

+0

你確定它是'id'而不是'_id'而做'find'?另外,如果'req.params.url'是ObjectId類型,請嘗試執行'mongoose.Types.ObjectId(req.params.url)'。我並不清楚你遇到的問題,但我建議記錄變量的值以檢查它們是否處於所需的形式。 –

+0

我已經記錄了這些值,它們都在所需的範圍內。 'id'是一個單獨的字段,它不是'_id'it是一個手動創建的id,它是一個隨機數。我有權訪問'req.params.url'(當我登錄它時它是正確的形式),但由於某種原因,當我使用'req.params.url'時,遊標的forEach函數永遠不會運行。 – JohnSnow

+0

我剛解決了! @TarushArora這是因爲我必須事先將'req.params.url'轉換爲數字! 'db.collection(「urls」)。find({「id」:+ req.params.url})'作品 – JohnSnow

回答

1

很可能是因爲req.params.url作爲字符串而不是數字傳遞。 Mongo對數據類型非常敏感,並且在req.params中傳遞的所有項都被視爲沒有投射的字符串。如果在查詢字符串時mongo文檔值是數字,則不會返回任何值。

純文本分析器可以幫助你,像mongo-qp