Bagaimana cara mengakses parameter GET setelah “?” dalam Express?

527

Saya tahu cara mendapatkan params untuk pertanyaan seperti ini:

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

Dalam hal ini, saya dapat menggunakan req.params.iduntuk mendapatkan parameter (misalnya 2dalam /sample/2).

Namun, untuk url seperti /sample/2?color=red, bagaimana saya bisa mengakses variabel color?

Saya mencoba req.params.colortetapi tidak berhasil.

Hanfei Sun
sumber

Jawaban:

776

Jadi, setelah memeriksa referensi kilat , saya menemukan bahwa req.query.colorakan mengembalikan nilai yang saya cari.

req.params merujuk pada item dengan tanda ':' di URL dan req.query merujuk pada item yang terkait dengan '?'

Contoh:

GET /something?color1=red&color2=blue

Kemudian secara ekspres, pawang:

app.get('/something', (req, res) => {
    req.query.color1 === 'red'  // true
    req.query.color2 === 'blue' // true
})
Hanfei Sun
sumber
Bisakah Anda memberi tahu saya cara memvalidasi "id"?
Anand Raj
1
@AnandRaj: apa maksud Anda: bagaimana memvalidasi "id"? Apa jenis validasi yang Anda inginkan? BTW, Anda bisa mendapatkan nilai iddi fungsi Anda seperti ini: var sampleId = req.params.id;.
Jochem Schulenklopper
4
Gunakan req.params.whateverdalam versi terbaru.
adelriosantiago
3
Pikiran yang req.paramsberbeda dari req.query! expressjs.com/en/api.html#req.params expressjs.com/en/api.html#req.query @adelriosantiago
caesarsol
81

Gunakan req.query, untuk mendapatkan nilai dalam parameter string kueri di rute. Refer req.query . Katakanlah jika dalam sebuah rute, http: // localhost: 3000 /? Name = satyam Anda ingin mendapatkan nilai untuk parameter nama, maka pengendali rute 'Get' Anda akan seperti ini: -

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

});
satyam kumar
sumber
mungkin beberapa info tentang querystring untuk mendapatkan jawaban yang lengkap
Schuere
67

Pembaruan: req.param() sekarang sudah usang, jadi ke depan jangan gunakan jawaban ini.


Jawaban Anda adalah cara yang disukai untuk melakukannya, namun saya pikir saya akan menunjukkan bahwa Anda juga dapat mengakses parameter url, posting, dan rute dengan semua req.param(parameterName, defaultValue).

Dalam kasus Anda:

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

Dari panduan kilat:

pencarian dilakukan dengan urutan sebagai berikut:

  • req.params
  • req.body
  • permintaan

Perhatikan bahwa panduan ini menyatakan sebagai berikut:

Akses langsung ke req.body, req.params, dan req.query harus disukai untuk kejelasan - kecuali Anda benar-benar menerima input dari setiap objek.

Namun dalam praktiknya, saya benar-benar menemukan req.param()cukup jelas dan membuat beberapa jenis refactoring lebih mudah.

Zugwalt
sumber
53

String dan parameter kueri berbeda.

Anda harus menggunakan keduanya dalam url perutean tunggal

Silakan periksa contoh di bawah ini semoga bermanfaat bagi Anda.

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

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

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

});

Dapatkan tautan untuk melewati segmen kedua Anda adalah contoh id Anda: http: // localhost: port / sample / 123

Jika Anda menghadapi masalah, gunakan variabel Passing sebagai string kueri menggunakan '?' operator

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

     var id = req.query.id; 

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

    });

Dapatkan tautan Anda seperti contoh ini: http: // localhost: port / sample? Id = 123

Keduanya dalam satu contoh

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

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

});

Dapatkan tautan contoh: http: // localhost: port / sample / 123? Id = 123

Raja Rama Mohan Thavalam
sumber
2
Terima kasih jawaban ini sangat membantu!
Bruno Tavares
44

@ Jawaban Zugwait benar. req.param()sudah ditinggalkan. Anda harus menggunakan req.params, req.queryatau req.body.

Tetapi hanya untuk membuatnya lebih jelas:

req.paramsakan diisi hanya dengan nilai rute. Artinya, jika Anda memiliki rute seperti /users/:id, Anda dapat mengakses iddi req.params.idatau req.params['id'].

req.querydan req.bodyakan diisi dengan semua params, terlepas dari apakah mereka berada di rute atau tidak. Tentu saja, parameter dalam string kueri akan tersedia di req.querydan parameter dalam badan pos akan tersedia di req.body.

Jadi, menjawab pertanyaan Anda, karena colortidak ada dalam rute, Anda harus dapat menggunakannya req.query.coloratau req.query['color'].

André Pena
sumber
17

Manual kilat mengatakan bahwa Anda harus menggunakan req.query untuk mengakses QueryString.

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

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

});
Jan Biasi
sumber
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!')
)
seme
sumber
7
Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan terbatas dan segera. Sebuah penjelasan yang tepat akan sangat meningkatkan nilai jangka panjang dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat untuk pembaca masa depan dengan lainnya, pertanyaan-pertanyaan serupa. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
iBug
2

Teknik yang bagus yang saya mulai gunakan dengan beberapa aplikasi saya di express adalah untuk membuat objek yang menggabungkan kueri, params, dan bidang isian objek permintaan express.

//./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;

Kemudian di badan pengontrol Anda, atau di mana pun dalam lingkup rantai permintaan ekspres, Anda dapat menggunakan sesuatu seperti di bawah ini:

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

Ini membuatnya menyenangkan dan berguna untuk hanya "menyelidiki" semua "data khusus" yang mungkin dikirimkan oleh pengguna dengan permintaan mereka.

Catatan

Mengapa bidang 'properti'? Karena itu adalah potongan cut-down, saya menggunakan teknik ini di sejumlah API saya, saya juga menyimpan data otentikasi / otorisasi ke objek ini, contoh di bawah ini.

/*
 * @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";
    }
} 
Lee Brindley
sumber
1
Ini mungkin ide yang buruk karena mempersulit mempertahankan titik akhir Anda. Anda tidak lagi tahu metode mana yang akan digunakan klien untuk memberikan parameter.
sdgfsdh
Itu sebenarnya salah satu keuntungan utama dari pendekatan ini untuk jujur, tidak harus tahu dari mana bidang itu berasal. Kelas ExpressData di atas bertindak sebagai jembatan, yang memungkinkan Anda untuk modularisasi logika bisnis Anda, memindahkannya dari rute pengontrol ekspres, yaitu Anda tidak memanggang 'req.query', 'req.body' ke dalam kode Anda, ini juga membuat kode bisnis Anda mudah diuji, sepenuhnya di luar ekspres.
Lee Brindley