มีความแตกต่างระหว่างการได้รับ QUERY_STRING อาร์กิวเมนต์ผ่านreq.query[myParam]
และreq.params.myParam
? ถ้าเป็นเช่นนั้นฉันควรใช้เมื่อใด
มีความแตกต่างระหว่างการได้รับ QUERY_STRING อาร์กิวเมนต์ผ่านreq.query[myParam]
และreq.params.myParam
? ถ้าเป็นเช่นนั้นฉันควรใช้เมื่อใด
คำตอบ:
req.params
มีพารามิเตอร์เส้นทาง (ในส่วนเส้นทางของ URL) และreq.query
มีพารามิเตอร์การสืบค้น URL (ตามหลัง?
ใน URL)
คุณยังสามารถใช้req.param(name)
เพื่อค้นหาพารามิเตอร์ในทั้งสองตำแหน่ง (เช่นเดียวกับreq.body
) แต่วิธีนี้เลิกใช้แล้ว
req.param
เลิกใช้งานแล้ว โหนดแนะนำให้ใช้req.query
หรือreq.params
ระบุเส้นทางนี้
app.get('/hi/:param1', function(req,res){} );
และให้ URL นี้
http://www.google.com/hi/there?qs1=you&qs2=tube
คุณจะต้อง:
req สอบถาม
{
qs1: 'you',
qs2: 'tube'
}
req params
{
param1: 'there'
}
/
สมมติว่าคุณได้กำหนดชื่อเส้นทางของคุณดังนี้:
https://localhost:3000/user/:userid
ซึ่งจะกลายเป็น:
https://localhost:3000/user/5896544
ที่นี่หากคุณจะพิมพ์: request.params
{
userId : 5896544
}
ดังนั้น
request.params.userId = 5896544
ดังนั้นrequest.paramsคือวัตถุที่มีคุณสมบัติของเส้นทางที่ตั้งชื่อ
และrequest.queryมาจากพารามิเตอร์การค้นหาใน URL เช่น:
https://localhost:3000/user?userId=5896544
request.query
{
userId: 5896544
}
ดังนั้น
request.query.userId = 5896544
คุณควรจะสามารถเข้าถึงแบบสอบถามโดยใช้สัญลักษณ์จุดได้แล้ว
หากคุณต้องการเข้าถึงบอกว่าคุณได้รับคำขอGETที่/checkEmail?type=email&utm_source=xxxx&email=xxxxx&utm_campaign=XX
และคุณต้องการดึงแบบสอบถามที่ใช้
var type = req.query.type,
email = req.query.email,
utm = {
source: req.query.utm_source,
campaign: req.query.utm_campaign
};
พารามิเตอร์ถูกใช้สำหรับพารามิเตอร์ที่กำหนดเองสำหรับการรับคำขอบางอย่างเช่น (ตัวอย่าง):
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)});
});
ฉันต้องการพูดถึงหมายเหตุสำคัญอย่างหนึ่งเกี่ยวกับreq.query
เนื่องจากตอนนี้ฉันกำลังทำงานกับฟังก์ชันการแบ่งหน้าตามreq.query
และฉันมีตัวอย่างที่น่าสนใจที่จะสาธิตให้คุณเห็น ...
ตัวอย่าง:
// 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
});
});
};
คุณจะสังเกตเห็น+
ป้ายด้านหน้าreq.query.pageSize
และreq.query.currentPage
ทำไม? หากคุณลบ+
ในกรณีนี้คุณจะได้รับข้อผิดพลาดและข้อผิดพลาดนั้นจะถูกโยนออกไปเนื่องจากเราจะใช้ประเภทที่ไม่ถูกต้อง (ด้วยข้อความแสดงข้อผิดพลาดฟิลด์ "ขีด จำกัด " จะต้องเป็นตัวเลข)
สำคัญ : โดยค่าเริ่มต้นหากคุณดึงข้อมูลบางอย่างจากพารามิเตอร์การค้นหาเหล่านี้จะเป็นสตริงเสมอเนื่องจาก URL นั้นมาพร้อมกับ URL และถือว่าเป็นข้อความ
หากเราต้องการทำงานกับตัวเลขและแปลงข้อความค้นหาจากข้อความเป็นตัวเลขเราก็สามารถเพิ่มเครื่องหมายบวกหน้าคำสั่งได้