为什么 req.params 返回未定义

Why is req.params returning undefined?

本文关键字:未定义 返回 params req 为什么      更新时间:2023-09-26

我在这里检查了两个类似的问题,评论中建议的内容都不适合我。

app.get('/:id', function(req,res) {
  console.log(req.params.id);
});
app.get('/:id', function(req, res) {
  db.query("SELECT * FROM entries WHERE id = $1", [req.params.id], function(err, dbRes) {
    if (!err) {
      res.render('show', { entry: dbRes.rows[0] });
    }
  });
});

如您所见,我尝试将结果记录到控制台以查看发生了什么。访问有问题的 URL 只会使页面加载,直到超时。在控制台中,我得到"未定义"。

如何定义 req.params?或者它的定义被拉到哪里,为什么它不返回值?

完整上下文:http://pastebin.com/DhWrPvjP

刚刚测试了您的代码,它工作正常。我认为您可能缺少网址参数。它应该是http://localhost:3000/1 - 或者您尝试检索的任何 ID。试试吧。

此外,您应该将扩展选项传递给您的bodyParser.urlencode方法:express抛出错误为"body-parser 已弃用未定义的扩展">

编辑:专门回答有关定义请求参数的问题。您无需执行任何操作即可定义请求参数,只需确保传入正确的 URL。Express 负责解析 URL 并为您定义请求参数。因此,如果您转到服务器上的 URL http://localhost/jimbob,则为 id 参数传入的值将作为 req.params.id 提供。有关详细信息,请参阅有关请求参数的此链接。

编辑 2:您可以尝试调试您的应用程序以查看您得到的结果。下面是有关如何在 Express 中启用调试以及如何使用节点检查器进行调试的链接。我看到你在 Ubuntu 上运行这个。所以,那里可能有一些我不知道的奇怪东西。(我在Mac上运行它。

我还会检查您在应用程序运行的计算机上运行的 Node 版本,并检查您的 Ubuntu 环境(或应用程序无法运行的任何计算机(上的 Node 版本。

app.get('/:id', function(req, res) {
  db.query("SELECT * FROM entries WHERE id = $1", [req.params.id], function(err, dbRes) {
    if (!err) {
      res.render('show', { entry: dbRes.rows[0] });
    }
  });
});

在您的代码中,URL 将是 localhost/some-id req.params.id 等于 some-id,参数直接从 url 字符串中提取,如果您尝试使用 post 或 get 方法发送信息,您想分别使用 req.body 和 req.query。我看不出任何理由你无法获得id,除非网址是错误的

或者如果您需要手动完成

app.get('/:id', function(req, res) {
  //if no req.params and assuming the id is the last item in the url
  var urlArray = req.url.split('/'),
      id = urlArray[urlArray.length-1];
  db.query("SELECT * FROM entries WHERE id = $1", [req.params.id], function(err, dbRes) {
    if (!err) {
      res.render('show', { entry: dbRes.rows[0] });
    }
  });
});

试试这个req.param('id') :D。它可能对您有用

我知道

我迟到了,但这篇文章帮助我调试了我的问题,所以我想我会添加我的建议,希望它能帮助其他人。

如果您使用带有承诺的 mysql2

const mysql = require("mysql2");
const pool = mysql.createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE
});
module.exports = pool.promise();

然后,您需要在请求中使用承诺。

router.get("/:id", (req, res) => {
  mysql
    .execute("SELECT * FROM entries WHERE id = $1", [req.params.id])
    .then(result => {
      res.send(result[0]);
    })
    .catch(err => {
      console.log(err);
    });
});

我花了几个小时调试我的代码,只是意识到我在连接中使用了promise()。希望这有所帮助,因为这篇文章帮助我进行了调试。