Câu trả lời:
req.params
chứa các tham số tuyến đường (trong phần đường dẫn của URL) và req.query
chứ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.
req.param
hiện không được dùng nữa. Node gợi ý sử dụng req.query
hoặcreq.params
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'
}
/
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
và 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
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=XX
và 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)});
});
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.query
và 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.pageSize
vàreq.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.