这可能有点难以解释,所以我会尽可能清楚。
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(用于查询数据库)。为什么这不起作用,令我难以置信。
答案 0 :(得分:1)
很可能是因为req.params.url是作为字符串而不是数字传递的。 Mongo对数据类型非常敏感,req.params中传递的所有项都被认为是没有强制转换的字符串。如果在查询字符串时mongo文档值是一个数字,则不会返回任何值。
纯文本解析器可以像mongo-qp
那样帮助您