为什么req.params返回undefined?

时间:2014-12-06 23:54:48

标签: javascript node.js express

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

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] });
    }
  });
});

如您所见,我已尝试将结果记录到控制台以查看正在进行的操作。访问相关网址只会使页面加载,直到超时为止。在控制台中,我得到了"未定义"。

如何定义req.params?或者它的定义被拉到哪里以及为什么它没有返回值?

完整背景:http://pastebin.com/DhWrPvjP

4 个答案:

答案 0 :(得分:1)

刚刚测试过你的代码,它运行正常。我想你可能会错过你的url参数。它应该是http://localhost:3000/1 - 或者您要检索的任何ID。尝试一下。

此外,您应该将扩展选项传递给bodyParser.urlencode方法:express throws error as `body-parser deprecated undefined extended`

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

编辑2 您可以尝试调试您的应用以查看您获得的内容。以下是有关如何enable debugging in Express以及如何使用node-inspector进行调试的链接。我看到你在Ubuntu上运行它。所以,那里可能有一些我不知道的奇怪之处。 (我在Mac上运行它。)

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

答案 1 :(得分:0)

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,params直接从url字符串中拉出来,如果你试图用post发送信息或获取你想要的方法分别使用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] });
    }
  });
});

答案 2 :(得分:0)

试试这个req.param('id'):D。它可能适合你

答案 3 :(得分:0)

我知道我参加晚会很晚,但是这篇文章帮助我调试了问题,因此我认为我会加我的建议,希望对其他人有所帮助。

如果您将mysql2与promises配合使用

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();

然后,您需要在请求中使用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()。希望这篇文章对我有所帮助,对您有所帮助。