Node.js: Perbedaan antara req.query [] dan req.params

124

Apakah ada perbedaan antara mendapatkan argumen QUERY_STRING melalui req.query[myParam]dan req.params.myParam? Jika ya, kapan saya harus menggunakan yang mana?

Pavindu
sumber

Jawaban:

142

req.paramsberisi parameter rute (di bagian jalur URL), dan req.queryberisi parameter kueri URL (setelah ?di URL).

Anda juga dapat menggunakan req.param(name)untuk mencari parameter di kedua tempat (dan juga req.body), tetapi metode ini sekarang sudah usang.

JohnnyHK
sumber
Ah, ok terima kasih, jadi keduanya disediakan oleh Express. Dan data POST yang saya akses melalui req.body.myParam?
1
Baik. Yang mana yang akan digunakan tergantung pada apa yang Anda coba lakukan.
JohnnyHK
Perhatikan juga: "Akses langsung ke req.body, req.params, dan req.query harus diutamakan untuk kejelasan - kecuali Anda benar-benar menerima masukan dari setiap objek." - dokumentasi ekspres
Ryan Q
2
req.paramsekarang tidak digunakan lagi. Node menyarankan menggunakan req.queryataureq.params
SaiyanGirl
3
mengapa menghentikannya? bagaimana jika kita menggunakan params atau query dan kemudian memutuskan untuk mengubahnya ke yang lain?
John
247

Diberikan rute ini

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

dan diberi URL ini http://www.google.com/hi/there?qs1=you&qs2=tube

Anda akan memiliki:

persyaratan pertanyaan

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

persyaratan params

{
  param1: 'there'
}

Express req.params >>

bajingan
sumber
Bagaimana jika saya perlu mendapatkan / hi /?
daniel
2
lihat req.url atau req.originalUrl atau req._originalUrl, lalu pisahkan pada/
ruffrey
22

Misalkan Anda telah menetapkan nama rute Anda seperti ini:

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

yang akan menjadi:

https://localhost:3000/user/5896544

Di sini, jika Anda akan mencetak: request.params

{
userId : 5896544
}

begitu

request.params.userId = 5896544

jadi request.params adalah objek yang berisi properti ke rute bernama

dan request.query berasal dari parameter kueri di URL misalnya:

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

request.query

{

userId: 5896544

}

begitu

request.query.userId = 5896544
Deeksha Sharma
sumber
Penjelasan yang bagus
Abk
7

Anda seharusnya dapat mengakses kueri menggunakan notasi titik sekarang.

Jika Anda ingin mengakses katakanlah Anda menerima permintaan GET di /checkEmail?type=email&utm_source=xxxx&email=xxxxx&utm_campaign=XXdan Anda ingin mengambil kueri yang digunakan.

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

Params digunakan untuk parameter didefinisikan diri untuk menerima permintaan, sesuatu seperti (misalnya):

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)});
});
Animesh Singh
sumber
0

Saya ingin menyebutkan satu catatan penting mengenai req.query, karena saat ini saya sedang mengerjakan fungsi pagination berdasarkan req.querydan saya punya satu contoh menarik untuk ditunjukkan kepada Anda ...

Contoh:

// 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
    });
  });
};

Anda akan melihat +tanda di depan req.query.pageSizedanreq.query.currentPage

Mengapa? Jika Anda menghapus +dalam hal ini, Anda akan mendapatkan kesalahan, dan kesalahan itu akan dilemparkan karena kita akan menggunakan tipe yang tidak valid (dengan pesan kesalahan, field 'batas' harus berupa angka).

Penting : Secara default jika Anda mengekstrak sesuatu dari parameter kueri ini, itu akan selalu berupa string , karena itu datang dari URL dan itu diperlakukan sebagai teks.

Jika kita perlu bekerja dengan angka, dan mengubah pernyataan query dari teks menjadi angka, kita cukup menambahkan tanda plus di depan pernyataan.

Mile Mijatović
sumber