2017-01-31 71 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