Node.js: Sự khác biệt giữa req.query [] và req.params


124

Có sự khác biệt giữa việc lấy QUERY_STRING đối số qua req.query[myParam]req.params.myParamkhông? Nếu vậy, tôi nên sử dụng cái nào?

Câu trả lời:


142

req.paramschứa các tham số tuyến đường (trong phần đường dẫn của URL) và req.querychứa các tham số truy vấn URL (sau phần ?trong URL).

Bạn cũng có thể sử dụng req.param(name)để tra cứu một tham số ở cả hai nơi (cũng như req.body), nhưng phương pháp này hiện không được dùng nữa.


Ah, ok, cảm ơn, vì vậy cả hai đều được cung cấp bởi Express. Và POST dữ liệu tôi truy cập qua req.body.myParam?

1
Đúng. Việc sử dụng cái nào phụ thuộc vào những gì bạn đang cố gắng làm.
JohnnyHK

Cũng lưu ý: "Quyền truy cập trực tiếp vào req.body, req.params và req.query nên được ưu tiên để rõ ràng - trừ khi bạn thực sự chấp nhận đầu vào từ mỗi đối tượng." - tài liệu nhanh
Ryan Q

2
req.paramhiện không được dùng nữa. Node gợi ý sử dụng req.queryhoặcreq.params
SaiyanGirl

3
tại sao không dùng nó? điều gì sẽ xảy ra nếu chúng ta sử dụng tham số hoặc truy vấn và sau đó quyết định thay đổi nó thành một tham số khác?
John

247

Với tuyến đường này

app.get('/hi/:param1', function(req,res){} );

và cung cấp URL này http://www.google.com/hi/there?qs1=you&qs2=tube

Bạn sẽ có:

yêu cầu. truy vấn

{
  qs1: 'you',
  qs2: 'tube'
}

yêu cầu. params

{
  param1: 'there'
}

Express req.params >>


Nếu tôi cần lấy / xin chào / thì sao?
daniel

2
hãy xem req.url hoặc req.originalUrl hoặc req._originalUrl, sau đó phân chia theo/
ruffrey

22

Giả sử bạn đã xác định tên tuyến đường của mình như sau:

https://localhost:3000/user/:userid

sẽ trở thành:

https://localhost:3000/user/5896544

Tại đây, nếu bạn sẽ in: request.params

{
userId : 5896544
}

vì thế

request.params.userId = 5896544

vì vậy request.params là một đối tượng chứa các thuộc tính của tuyến đường được đặt tên

request.query đến từ các tham số truy vấn trong URL, ví dụ:

https://localhost:3000/user?userId=5896544 

request.query

{

userId: 5896544

}

vì thế

request.query.userId = 5896544

Giải thích hay
Abk

7

Bây giờ bạn có thể truy cập truy vấn bằng ký hiệu dấu chấm.

Nếu bạn muốn truy cập, hãy nói rằng bạn đang nhận được yêu cầu GET tại /checkEmail?type=email&utm_source=xxxx&email=xxxxx&utm_campaign=XXvà bạn muốn tìm nạp truy vấn được sử dụng.

var type = req.query.type,
    email = req.query.email,
    utm = {
     source: req.query.utm_source,
     campaign: req.query.utm_campaign
    };

Các tham số được sử dụng cho tham số tự định nghĩa để nhận yêu cầu, giống như (ví dụ):

router.get('/:userID/food/edit/:foodID', function(req, res){
 //sample GET request at '/xavg234/food/edit/jb3552'

 var userToFind = req.params.userID;//gets xavg234
 var foodToSearch = req.params.foodID;//gets jb3552
 User.findOne({'userid':userToFind}) //dummy code
     .then(function(user){...})
     .catch(function(err){console.log(err)});
});

0

Tôi muốn đề cập đến một lưu ý quan trọng liên quan đến req.query, bởi vì hiện tại tôi đang làm việc dựa trên chức năng phân trang req.queryvà tôi có một ví dụ thú vị để chứng minh cho bạn ...

Thí dụ:

// Fetching patients from the database
exports.getPatients = (req, res, next) => {

const pageSize = +req.query.pageSize;
const currentPage = +req.query.currentPage;

const patientQuery = Patient.find();
let fetchedPatients;

// If pageSize and currentPage are not undefined (if they are both set and contain valid values)
if(pageSize && currentPage) {
    /**
     * Construct two different queries 
     * - Fetch all patients 
     * - Adjusted one to only fetch a selected slice of patients for a given page
     */
    patientQuery
        /**
         * This means I will not retrieve all patients I find, but I will skip the first "n" patients
         * For example, if I am on page 2, then I want to skip all patients that were displayed on page 1,
         * 
         * Another example: if I am displaying 7 patients per page , I want to skip 7 items because I am on page 2,
         * so I want to skip (7 * (2 - 1)) => 7 items
         */
        .skip(pageSize * (currentPage - 1))

        /**
         * Narrow dont the amound documents I retreive for the current page
         * Limits the amount of returned documents
         * 
         * For example: If I got 7 items per page, then I want to limit the query to only
         * return 7 items. 
         */
        .limit(pageSize);
}
patientQuery.then(documents => {
    res.status(200).json({
        message: 'Patients fetched successfully',
        patients: documents
    });
  });
};

Bạn sẽ nhận thấy +dấu hiệu phía trước req.query.pageSizereq.query.currentPage

Tại sao? Nếu bạn xóa +trong trường hợp này, bạn sẽ gặp lỗi, và lỗi đó sẽ được ném ra vì chúng tôi sẽ sử dụng kiểu không hợp lệ (với trường thông báo lỗi 'giới hạn' phải là số).

Quan trọng : Theo mặc định, nếu bạn trích xuất nội dung nào đó từ các tham số truy vấn này, thì nó sẽ luôn là một chuỗi , bởi vì nó đến URL và nó được coi như một văn bản.

Nếu chúng ta cần làm việc với các con số và chuyển đổi các câu lệnh truy vấn từ văn bản sang số, chúng ta có thể chỉ cần thêm dấu cộng vào trước câu lệnh.

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.