Node.js: req.query [] ve req.params arasındaki fark


124

QUERY_STRING bağımsız değişkenlerini req.query[myParam]ve aracılığıyla elde etmek arasında bir fark var mı req.params.myParam? Öyleyse, hangisini ne zaman kullanmalıyım?

Yanıtlar:


143

req.paramsrota parametrelerini (URL'nin yol kısmında) req.queryiçerir ve URL sorgu parametrelerini (URL'den sonra ?) içerir.

Her req.param(name)iki yerde de bir parametre aramak için kullanabilirsiniz (hem de req.body), ancak bu yöntem artık kullanımdan kaldırılmıştır.


Ah, tamam, teşekkürler, yani ikisi de Express tarafından sağlanıyor. Ve req.body.myParam aracılığıyla eriştiğim POST verileri?

1
Sağ. Hangisini kullanacağınız, ne yapmaya çalıştığınıza bağlıdır.
JohnnyHK

Ayrıca şunu unutmayın: "req.body, req.params ve req.query'ye doğrudan erişim, her nesneden gelen girdiyi gerçekten kabul etmediğiniz sürece, netlik açısından tercih edilmelidir." - hızlı dokümantasyon
Ryan Q

2
req.paramartık kullanımdan kaldırıldı. Düğüm req.queryveya kullanmayı öneriyorreq.params
SaiyanGirl

3
neden reddediyorsun? Ya parametreler veya sorgu kullanırsak ve sonra onu başka bir sorguyla değiştirmeye karar verirsek?
John

248

Bu rota verildiğinde

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

ve bu URL verildi http://www.google.com/hi/there?qs1=you&qs2=tube

Sahip olacaksın:

req. sorgu

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

req. parametreler

{
  param1: 'there'
}

Ekspres req.params >>


Ya / hi / almam gerekirse?
daniel

2
req.url veya req.originalUrl veya req._originalUrl'ye bir göz atın, sonra/
ruffrey

23

Güzergahınızın adını şu şekilde tanımladığınızı varsayalım:

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

hangisi olacak:

https://localhost:3000/user/5896544

Burada yazdıracaksanız: request.params

{
userId : 5896544
}

yani

request.params.userId = 5896544

bu nedenle request.params , adlandırılmış yolun özelliklerini içeren bir nesnedir

ve request.query , URL’deki sorgu parametrelerinden gelir, örneğin:

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

request.query

{

userId: 5896544

}

yani

request.query.userId = 5896544

İyi açıklama
Abk

7

Şimdi nokta notasyonu kullanarak sorguya erişebilmelisiniz.

Erişmek istiyorsanız, adresinde bir GET isteği aldığınızı /checkEmail?type=email&utm_source=xxxx&email=xxxxx&utm_campaign=XXve kullanılan sorguyu almak istediğinizi varsayalım .

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

Parametreler , istek almak için kendi tanımlı parametre için kullanılır, örneğin (örnek):

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

Bununla ilgili önemli bir nottan bahsetmek istiyorum req.query, çünkü şu anda temel alan sayfalandırma işlevi üzerinde çalışıyorum req.queryve size göstereceğim ilginç bir örnek var ...

Misal:

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

Fark edecek +önünde işareti req.query.pageSizevereq.query.currentPage

Neden? +Bu durumda silerseniz , bir hata alırsınız ve bu hata, geçersiz tür kullanacağımız için atılır (hata mesajı 'limit' alanı sayısal olmalıdır).

Önemli : Varsayılan olarak, bu sorgu parametrelerinden bir şey çıkarırsanız, bu her zaman bir dize olacaktır , çünkü URL'den gelir ve metin olarak kabul edilir.

Sayılarla çalışmamız ve sorgu ifadelerini metinden sayıya dönüştürmemiz gerekirse, ifadenin önüne basitçe bir artı işareti ekleyebiliriz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.