req.params在mongo查询中不起作用

时间:2017-01-31 15:55:47

标签: node.js mongodb request

这可能有点难以解释,所以我会尽可能清楚。

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." })
    }
});

我正在尝试使用ID号查询数据库,该ID号将使用相应的URL进行响应,并重定向到该URL。数据库中填充了URLS及其各自的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(用于查询数据库)。为什么这不起作用,令我难以置信。

1 个答案:

答案 0 :(得分:1)

很可能是因为req.params.url是作为字符串而不是数字传递的。 Mongo对数据类型非常敏感,req.params中传递的所有项都被认为是没有强制转换的字符串。如果在查询字符串时mongo文档值是一个数字,则不会返回任何值。

纯文本解析器可以像mongo-qp

那样帮助您