“?” Den sonra GET parametrelerine nasıl erişilir? Express?


527

Bunun gibi sorguların parametrelerini nasıl alacağımı biliyorum:

app.get('/sample/:id', routes.sample);

Bu durumda, req.params.idparametreyi almak için kullanabilirim (örneğin, 2içinde /sample/2).

Ancak, url gibi /sample/2?color=red, değişkene nasıl erişebilirim color?

Denedim req.params.colorama işe yaramadı.

Yanıtlar:


776

Yani, ekspres referansı kontrol ettikten sonra , req.query.colorbana aradığım değeri döndüreceğini buldum .

req.params, URL'de ':' bulunan öğeleri, req.query ise '?' ile ilişkili öğeleri ifade eder

Misal:

GET /something?color1=red&color2=blue

Sonra ekspres olarak, işleyici:

app.get('/something', (req, res) => {
    req.query.color1 === 'red'  // true
    req.query.color2 === 'blue' // true
})

"Kimlik" i nasıl doğrulayacağımı söyler misiniz?
Anand Raj

1
@AnandRaj: ne demek istiyorsun: "id" nasıl doğrulanır? Ne tür bir doğrulama istiyorsun? BTW, değerini alabilirsiniz idböyle Fonksiyonunuzda: var sampleId = req.params.id;.
Jochem Schulenklopper

4
req.params.whateverEn son sürümlerde kullanın .
adelriosantiago

3
req.paramsFarklı olan zihin req.query! expressjs.com/en/api.html#req.params expressjs.com/en/api.html#req.query @adelriosantiago
caesarsol

81

Yoldaki sorgu dizesi parametresindeki değeri almak için req.query kullanın. İstenilen sorguya bakınız . Bir rotadaysa, http: // localhost: 3000 /? Name = satyam name parametresi için değer almak istiyorsanız, 'Get' yol işleyicinizin şöyle olacağını söyleyin: -

app.get('/', function(req, res){
    console.log(req.query.name);
    res.send('Response send to client::'+req.query.name);

});

tam bir cevap almak için
querystring

67

Güncelleme: req.param() artık kullanımdan kaldırıldı, bu yüzden ileride bu yanıtı kullanmayın.


Cevabınız bunu yapmanın tercih edilen yoludur, ancak url, post ve rota parametrelerine de erişebileceğinize dikkat çekeceğim req.param(parameterName, defaultValue).

Senin durumunda:

var color = req.param('color');

Ekspres kılavuzdan:

arama aşağıdaki sırayla gerçekleştirilir:

  • req.params
  • req.body
  • req.query

Kılavuzun aşağıdakileri belirttiğini unutmayın:

Req.body, req.params ve req.query'ye doğrudan erişim, her nesneden girişi gerçekten kabul etmediğiniz sürece, netlik için tercih edilmelidir.

Ancak pratikte aslında req.param()yeterince net buldum ve bazı yeniden düzenleme türlerini kolaylaştırıyorum.


53

Sorgu dizesi ve parametreleri farklı.

Her ikisini de tek yönlendirme URL'sinde kullanmanız gerekir

Lütfen aşağıdaki örneğin sizin için yararlı olabileceğini kontrol edin.

app.get('/sample/:id', function(req, res) {

 var id = req.params.id; //or use req.param('id')

  ................

});

İkinci segmentinizi iletme bağlantısını almak sizin kimliğinizdir: http: // localhost: port / sample / 123

Sorun yaşıyorsanız lütfen '?' Kullanarak değişkenleri sorgu dizesi olarak geçirin Şebeke

  app.get('/sample', function(req, res) {

     var id = req.query.id; 

      ................

    });

Aşağıdaki gibi bağlantıyı alın: http: // localhost: port / sample? İd = 123

Her ikisi de tek bir örnekte

app.get('/sample/:id', function(req, res) {

 var id = req.params.id; //or use req.param('id')
 var id2 = req.query.id; 
  ................

});

Bağlantı örneğini alın: http: // localhost: bağlantı noktası / örnek / 123? İd = 123


2
Teşekkürler bu cevap çok yardımcı oldu!
Bruno Tavares

44

@ Zugwait'in cevabı doğru. req.param()kullanımdan kaldırıldı. Kullanmalısın req.params, req.queryveya req.body.

Ama sadece daha netleştirmek için:

req.paramsyalnızca rota değerleriyle doldurulur. Eğer bir rota gibi varsa kendisine, /users/:id, erişebileceğiniz idya req.params.idya req.params['id'].

req.queryve rotada olup olmadıklarına bakılmaksızın tüm parametrelerle req.bodydoldurulur . Tabii ki, sorgu dizesindeki parametreler ve bir yazı gövdesindeki parametreler de bulunacaktır .req.queryreq.body

Bu nedenle, sorularınızı yanıtlarken, colorrotada olmadığı gibi , req.query.colorveya öğesini kullanarak alabilmeniz gerekir req.query['color'].


17

Hızlı el kitabı , QueryString'e erişmek için req.query kullanmanız gerektiğini söylüyor .

// Requesting /display/post?size=small
app.get('/display/post', function(req, res, next) {

  var isSmall = req.query.size === 'small'; // > true
  // ...

});

7
const express = require('express')
const bodyParser = require('body-parser')
const { usersNdJobs, userByJob, addUser , addUserToCompany } = require ('./db/db.js')

const app = express()
app.set('view engine', 'pug')
app.use(express.static('public'))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.get('/', (req, res) => {
  usersNdJobs()
    .then((users) => {
      res.render('users', { users })
    })
    .catch(console.error)
})

app.get('/api/company/users', (req, res) => {
  const companyname = req.query.companyName
  console.log(companyname)
  userByJob(companyname)
    .then((users) => {
      res.render('job', { users })
    }).catch(console.error)
})

app.post('/api/users/add', (req, res) => {
  const userName = req.body.userName
  const jobName = req.body.jobName
  console.log("user name = "+userName+", job name : "+jobName)
  addUser(userName, jobName)
    .then((result) => {
      res.status(200).json(result)
    })
    .catch((error) => {
      res.status(404).json({ 'message': error.toString() })
    })
})
app.post('/users/add', (request, response) => {
  const { userName, job } = request.body
  addTeam(userName, job)
  .then((user) => {
    response.status(200).json({
      "userName": user.name,
      "city": user.job
    })
  .catch((err) => {
    request.status(400).json({"message": err})
  })
})

app.post('/api/user/company/add', (req, res) => {
  const userName = req.body.userName
  const companyName = req.body.companyName
  console.log(userName, companyName)
  addUserToCompany(userName, companyName)
  .then((result) => {
    res.json(result)
  })
  .catch(console.error)
})

app.get('/api/company/user', (req, res) => {
 const companyname = req.query.companyName
 console.log(companyname)
 userByJob(companyname)
 .then((users) => {
   res.render('jobs', { users })
 })
})

app.listen(3000, () =>
  console.log('Example app listening on port 3000!')
)

7
Sınırlı ve anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Bir Doğru bir açıklama ölçüde uzun vadeli değer artıracak göstererek neden bu soruna iyi bir çözüm olduğunu ve diğer benzer sorularla gelecek okuyucularına daha kullanışlı bir hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
iBug

2

Express'teki bazı uygulamalarımla kullanmaya başladığım güzel bir teknik, ifade istek nesnesinin sorgusunu, parametrelerini ve gövde alanlarını birleştiren bir nesne oluşturmaktır.

//./express-data.js
const _ = require("lodash");

class ExpressData {

    /*
    * @param {Object} req - express request object
    */
    constructor (req) {

        //Merge all data passed by the client in the request
        this.props = _.merge(req.body, req.params, req.query);
     }

}

module.exports = ExpressData;

Daha sonra kontrol cihazınızın gövdesinde veya ekspres istek zinciri kapsamında başka herhangi bir yerde, aşağıdaki gibi bir şey kullanabilirsiniz:

//./some-controller.js

const ExpressData = require("./express-data.js");
const router = require("express").Router();


router.get("/:some_id", (req, res) => {

    let props = new ExpressData(req).props;

    //Given the request "/592363122?foo=bar&hello=world"
    //the below would log out 
    // {
    //   some_id: 592363122,
    //   foo: 'bar',
    //   hello: 'world'
    // }
    console.log(props);

    return res.json(props);
});

Bu, bir kullanıcının isteği ile göndermiş olabileceği tüm "özel verileri" yalnızca "araştırmayı" güzel ve kullanışlı hale getirir.

Not

Neden 'sahne' alanı? Bu bir kısmi snippet olduğundan, bu tekniği bir dizi API'mda kullanıyorum, ayrıca kimlik doğrulama / yetkilendirme verilerini bu nesneye, örneğin aşağıdaki örnekte saklıyorum.

/*
 * @param {Object} req - Request response object
*/
class ExpressData {

    /*
    * @param {Object} req - express request object
    */
    constructor (req) {

        //Merge all data passed by the client in the request
        this.props = _.merge(req.body, req.params, req.query);

        //Store reference to the user
        this.user = req.user || null;

        //API connected devices (Mobile app..) will send x-client header with requests, web context is implied.
        //This is used to determine how the user is connecting to the API 
        this.client = (req.headers) ? (req.headers["x-client"] || (req.client || "web")) : "web";
    }
} 

1
Bu muhtemelen kötü bir fikir çünkü uç noktalarınızı korumayı zorlaştırıyor. Artık istemcilerin parametreleri iletmek için hangi yöntemi kullanacağını bilmiyorsunuz.
sdgfsdh

Aslında bu alanların nereden geldiğini bilmek zorunda kalmamak, dürüst olmak gerekirse bu yaklaşımın temel avantajlarından biridir. Yukarıdaki ExpressData sınıfı bir köprü görevi görür ve iş mantığınızı modüler hale getirmenize, ekspres denetleyici rotalarından uzaklaştırmanıza olanak tanır, yani 'req.query', 'req.body' kodunuza pişirmezsiniz, bu da iş kodunuz kolayca test edilebilir, tamamen ekspres dışında.
Lee Brindley
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.