Cách truy cập các tham số GET sau khi ăn? trong Express?


527

Tôi biết cách lấy thông số cho các truy vấn như thế này:

app.get('/sample/:id', routes.sample);

Trong trường hợp này, tôi có thể sử dụng req.params.idđể lấy tham số (ví dụ: 2in /sample/2).

Tuy nhiên, đối với url như /sample/2?color=redthế nào, làm thế nào tôi có thể truy cập vào biến color?

Tôi đã thử req.params.colornhưng nó không hoạt động.

Câu trả lời:


776

Vì vậy, sau khi kiểm tra tài liệu tham khảo rõ ràng , tôi thấy rằng nó req.query.colorsẽ trả lại cho tôi giá trị mà tôi đang tìm kiếm.

req.params đề cập đến các mục có dấu ':' trong URL và req.query đề cập đến các mục được liên kết với '?'

Thí dụ:

GET /something?color1=red&color2=blue

Sau đó, trong express, xử lý:

app.get('/something', (req, res) => {
    req.query.color1 === 'red'  // true
    req.query.color2 === 'blue' // true
})

Bạn có thể vui lòng cho tôi biết làm thế nào để xác nhận "id"?
Anand Raj

1
@AnandRaj: ý bạn là gì: làm thế nào để xác thực "id"? Bạn muốn loại xác nhận nào? BTW, bạn có thể nhận được giá trị idtrong hàm của bạn như thế này : var sampleId = req.params.id;.
Joool Schulenklopper

4
Sử dụng req.params.whatevertrong các phiên bản mới nhất.
adelriosantiago

3
Tâm mà req.paramskhác req.query! expressjs.com/en/api.html#req.params expressjs.com/en/api.html#req.query @adelriosantiago
caesarsol

81

Sử dụng req.query, để nhận giá trị anh ta trong tham số chuỗi truy vấn trong tuyến. Tham khảo req.query . Giả sử nếu trong một tuyến đường, http: // localhost: 3000 /? Name = satyam bạn muốn nhận giá trị cho tham số tên, thì trình xử lý tuyến đường 'Nhận' của bạn sẽ như sau: -

app.get('/', function(req, res){
    console.log(req.query.name);
    res.send('Response send to client::'+req.query.name);

});

có lẽ một số thông tin về chuỗi truy vấn để có câu trả lời hoàn chỉnh
Schuere

67

Cập nhật: req.param() hiện không được chấp nhận, vì vậy trong tương lai không sử dụng câu trả lời này.


Câu trả lời của bạn là cách ưa thích để làm điều đó, tuy nhiên tôi nghĩ tôi chỉ ra rằng bạn cũng có thể truy cập tất cả các tham số url, bài đăng và tuyến đường req.param(parameterName, defaultValue).

Trong trường hợp của bạn:

var color = req.param('color');

Từ hướng dẫn nhanh:

tra cứu được thực hiện theo thứ tự sau:

  • req.params
  • yêu cầu
  • yêu cầu

Lưu ý hướng dẫn không nêu như sau:

Truy cập trực tiếp vào req.body, req.params và req.query nên được ưu tiên cho sự rõ ràng - trừ khi bạn thực sự chấp nhận đầu vào từ mỗi đối tượng.

Tuy nhiên trong thực tế tôi thực sự thấy req.param()đủ rõ ràng và làm cho một số loại tái cấu trúc dễ dàng hơn.


53

Chuỗi truy vấn và tham số là khác nhau.

Bạn cần sử dụng cả hai trong url định tuyến đơn

Vui lòng kiểm tra ví dụ dưới đây có thể hữu ích cho bạn.

app.get('/sample/:id', function(req, res) {

 var id = req.params.id; //or use req.param('id')

  ................

});

Nhận liên kết để vượt qua phân khúc thứ hai của bạn là ví dụ id của bạn: http: // localhost: port / sample / 123

Nếu bạn gặp vấn đề, vui lòng sử dụng Biến biến dưới dạng chuỗi truy vấn bằng cách sử dụng '?' nhà điều hành

  app.get('/sample', function(req, res) {

     var id = req.query.id; 

      ................

    });

Nhận liên kết của bạn như ví dụ này: http: // localhost: port / sample? Id = 123

Cả hai trong một ví dụ duy nhất

app.get('/sample/:id', function(req, res) {

 var id = req.params.id; //or use req.param('id')
 var id2 = req.query.id; 
  ................

});

Lấy ví dụ liên kết: http: // localhost: port / sample / 123? Id = 123


2
Cảm ơn câu trả lời này rất hữu ích!
Bruno Tavares

44

Câu trả lời của @ Zugwait là chính xác. req.param()bị phản đối Bạn nên sử dụng req.params, req.queryhoặc req.body.

Nhưng chỉ để làm cho nó rõ ràng hơn:

req.paramssẽ được điền chỉ với các giá trị tuyến. Đó là, nếu bạn có một con đường như /users/:id, bạn có thể truy cập idhoặc trong req.params.idhoặc req.params['id'].

req.queryreq.bodysẽ được điền với tất cả các thông số , bất kể họ có ở trong tuyến hay không. Tất nhiên, các tham số trong chuỗi truy vấn sẽ có sẵn req.queryvà các tham số trong phần thân bài sẽ có sẵn req.body.

Vì vậy, trả lời các câu hỏi của bạn, vì colorkhông có trong tuyến đường, bạn sẽ có thể có được nó bằng cách sử dụng req.query.colorhoặc req.query['color'].


17

Hướng dẫn nhanh nói rằng bạn nên sử dụng req.query để truy cập QueryString.

// Requesting /display/post?size=small
app.get('/display/post', function(req, res, next) {

  var isSmall = req.query.size === 'small'; // > true
  // ...

});

7
const express = require('express')
const bodyParser = require('body-parser')
const { usersNdJobs, userByJob, addUser , addUserToCompany } = require ('./db/db.js')

const app = express()
app.set('view engine', 'pug')
app.use(express.static('public'))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.get('/', (req, res) => {
  usersNdJobs()
    .then((users) => {
      res.render('users', { users })
    })
    .catch(console.error)
})

app.get('/api/company/users', (req, res) => {
  const companyname = req.query.companyName
  console.log(companyname)
  userByJob(companyname)
    .then((users) => {
      res.render('job', { users })
    }).catch(console.error)
})

app.post('/api/users/add', (req, res) => {
  const userName = req.body.userName
  const jobName = req.body.jobName
  console.log("user name = "+userName+", job name : "+jobName)
  addUser(userName, jobName)
    .then((result) => {
      res.status(200).json(result)
    })
    .catch((error) => {
      res.status(404).json({ 'message': error.toString() })
    })
})
app.post('/users/add', (request, response) => {
  const { userName, job } = request.body
  addTeam(userName, job)
  .then((user) => {
    response.status(200).json({
      "userName": user.name,
      "city": user.job
    })
  .catch((err) => {
    request.status(400).json({"message": err})
  })
})

app.post('/api/user/company/add', (req, res) => {
  const userName = req.body.userName
  const companyName = req.body.companyName
  console.log(userName, companyName)
  addUserToCompany(userName, companyName)
  .then((result) => {
    res.json(result)
  })
  .catch(console.error)
})

app.get('/api/company/user', (req, res) => {
 const companyname = req.query.companyName
 console.log(companyname)
 userByJob(companyname)
 .then((users) => {
   res.render('jobs', { users })
 })
})

app.listen(3000, () =>
  console.log('Example app listening on port 3000!')
)

7
Cảm ơn bạn vì đoạn mã này, có thể cung cấp một số trợ giúp hạn chế, ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện.
iBug

2

Một kỹ thuật hay mà tôi đã bắt đầu sử dụng với một số ứng dụng của mình trên express là tạo một đối tượng hợp nhất truy vấn, thông số và trường cơ thể của đối tượng yêu cầu của express.

//./express-data.js
const _ = require("lodash");

class ExpressData {

    /*
    * @param {Object} req - express request object
    */
    constructor (req) {

        //Merge all data passed by the client in the request
        this.props = _.merge(req.body, req.params, req.query);
     }

}

module.exports = ExpressData;

Sau đó, trong phần thân bộ điều khiển của bạn hoặc bất kỳ nơi nào khác trong phạm vi của chuỗi yêu cầu cấp tốc, bạn có thể sử dụng một cái gì đó như dưới đây:

//./some-controller.js

const ExpressData = require("./express-data.js");
const router = require("express").Router();


router.get("/:some_id", (req, res) => {

    let props = new ExpressData(req).props;

    //Given the request "/592363122?foo=bar&hello=world"
    //the below would log out 
    // {
    //   some_id: 592363122,
    //   foo: 'bar',
    //   hello: 'world'
    // }
    console.log(props);

    return res.json(props);
});

Điều này làm cho nó tốt và tiện dụng khi chỉ "đào sâu" vào tất cả "dữ liệu tùy chỉnh" mà người dùng có thể đã gửi theo yêu cầu của họ.

Ghi chú

Tại sao trường 'đạo cụ'? Vì đó là đoạn trích, tôi sử dụng kỹ thuật này trong một số API của mình, tôi cũng lưu trữ dữ liệu xác thực / ủy quyền vào đối tượng này, ví dụ bên dưới.

/*
 * @param {Object} req - Request response object
*/
class ExpressData {

    /*
    * @param {Object} req - express request object
    */
    constructor (req) {

        //Merge all data passed by the client in the request
        this.props = _.merge(req.body, req.params, req.query);

        //Store reference to the user
        this.user = req.user || null;

        //API connected devices (Mobile app..) will send x-client header with requests, web context is implied.
        //This is used to determine how the user is connecting to the API 
        this.client = (req.headers) ? (req.headers["x-client"] || (req.client || "web")) : "web";
    }
} 

1
Đây có lẽ là một ý tưởng tồi vì nó làm cho việc duy trì điểm cuối của bạn khó khăn hơn. Bạn không còn biết khách hàng sẽ sử dụng phương thức nào để truyền tham số.
sdgfsdh

Đó thực sự là một trong những lợi thế chính của phương pháp này, không phải biết các lĩnh vực đến từ đâu. Lớp ExpressData ở trên hoạt động như một cây cầu, cho phép bạn mô đun hóa logic nghiệp vụ của mình, di chuyển nó ra khỏi các tuyến của bộ điều khiển tốc hành, tức là bạn không nướng 'req.query', 'req.body' vào mã của mình, điều này cũng làm cho mã doanh nghiệp của bạn dễ dàng kiểm tra, hoàn toàn bên ngoài thể hiện.
Lee Brindley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.