Node.js: ความแตกต่างระหว่าง req.query [] และ req.params


124

มีความแตกต่างระหว่างการได้รับ QUERY_STRING อาร์กิวเมนต์ผ่านreq.query[myParam]และreq.params.myParam? ถ้าเป็นเช่นนั้นฉันควรใช้เมื่อใด

คำตอบ:


143

req.paramsมีพารามิเตอร์เส้นทาง (ในส่วนเส้นทางของ URL) และreq.queryมีพารามิเตอร์การสืบค้น URL (ตามหลัง?ใน URL)

คุณยังสามารถใช้req.param(name)เพื่อค้นหาพารามิเตอร์ในทั้งสองตำแหน่ง (เช่นเดียวกับreq.body) แต่วิธีนี้เลิกใช้แล้ว


โอเคขอบคุณดังนั้นทั้งสองอย่างจึงจัดทำโดย Express และข้อมูล POST ที่ฉันเข้าถึงผ่าน req.body.myParam?

1
ขวา. จะใช้อันไหนขึ้นอยู่กับสิ่งที่คุณพยายามทำ
JohnnyHK

นอกจากนี้โปรดทราบ: "การเข้าถึง req.body, req.params และ req.query โดยตรงควรได้รับการสนับสนุนเพื่อความชัดเจน - เว้นแต่คุณจะยอมรับการป้อนข้อมูลจากแต่ละวัตถุอย่างแท้จริง" - เอกสารด่วน
Ryan Q

2
req.paramเลิกใช้งานแล้ว โหนดแนะนำให้ใช้req.queryหรือreq.params
SaiyanGirl

3
ทำไมถึงเลิกใช้งาน? จะเกิดอะไรขึ้นถ้าเราใช้พารามิเตอร์หรือคิวรีแล้วตัดสินใจเปลี่ยนเป็นแบบอื่น?
John

248

ระบุเส้นทางนี้

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'
}

ด่วน req.params >>


จะทำอย่างไรถ้าฉันต้องการได้รับ / hi /?
daniel

2
ดูที่ req.url หรือ req.originalUrl หรือ req._originalUrl จากนั้นแยกใน/
ruffrey

23

สมมติว่าคุณได้กำหนดชื่อเส้นทางของคุณดังนี้:

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

คำอธิบายที่ดี
Abk

7

คุณควรจะสามารถเข้าถึงแบบสอบถามโดยใช้สัญลักษณ์จุดได้แล้ว

หากคุณต้องการเข้าถึงบอกว่าคุณได้รับคำขอ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)});
});

0

ฉันต้องการพูดถึงหมายเหตุสำคัญอย่างหนึ่งเกี่ยวกับ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 และถือว่าเป็นข้อความ

หากเราต้องการทำงานกับตัวเลขและแปลงข้อความค้นหาจากข้อความเป็นตัวเลขเราก็สามารถเพิ่มเครื่องหมายบวกหน้าคำสั่งได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.