簡體   English   中英

為什么req.params返回未定義?

[英]Why is req.params returning undefined?

我在這里檢查了兩個類似的問題,但評論中建議的任何一項都不適合我。

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

只需測試您的代碼,它就可以正常工作。 我認為您可能缺少url參數。 它應該是http://localhost:3000/1或您要檢索的任何ID。 試試看。

另外,您應該將extended選項傳遞給bodyParser.urlencode方法: Express拋出錯誤,因為`body-parser不建議使用undefined Extended`。

編輯:專門回答有關定義請求參數的問題。 除了確保您輸入正確的URL外,您無需執行任何其他操作即可定義請求參數。 Express負責解析URL並為您定義請求參數。 因此,如果您在服務器上轉到URL http://localhost/jimbob ,則為id參數傳遞的值將作為req.params.id 有關更多信息,請參見此請求參數鏈接。

編輯2:您可以嘗試調試您的應用程序,以查看得到了什么。 這是有關如何在Express中啟用調試以及如何使用node-inspector進行調試的鏈接。 我看到您在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,如果您嘗試使用post發送信息或獲取要使用req的方法,則參數直接從url字符串中提取。正文和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();

然后,您需要在請求中使用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() 希望這篇文章對我有所幫助,對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM