Come accedere ai parametri GET dopo "?" in Express?


527

So come ottenere i parametri per query come questa:

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

In questo caso, posso usare req.params.idper ottenere il parametro (ad esempio 2in /sample/2).

Tuttavia, per url come /sample/2?color=red, come posso accedere alla variabile color?

Ci ho provato req.params.colorma non ha funzionato.

Risposte:


776

Quindi, dopo aver verificato il riferimento espresso , ho scoperto che req.query.colormi avrebbe restituito il valore che sto cercando.

req.params si riferisce a elementi con un ':' nell'URL e req.query si riferisce a elementi associati a '?'

Esempio:

GET /something?color1=red&color2=blue

Quindi in express, il gestore:

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

Potresti dirmi come convalidare "id"?
Anand Raj,

1
@AnandRaj: cosa intendi con: come convalidare "id"? Che tipo di validazione vuoi? A proposito, è possibile ottenere il valore della idnella vostra funzione come questa: var sampleId = req.params.id;.
Jochem Schulenklopper,

4
Utilizzare req.params.whatevernelle ultime versioni.
adelriosantiago,

3
Mente che req.paramsè diverso da req.query! expressjs.com/en/api.html#req.params expressjs.com/en/api.html#req.query @adelriosantiago
caesarsol

81

Utilizzare req.query per ottenere il valore nel parametro della stringa di query nel percorso. Fare riferimento a req.query . Di 'se in un percorso, http: // localhost: 3000 /? Name = satyam vuoi ottenere il valore per il parametro name, allora il tuo gestore del percorso' Get 'andrà in questo modo: -

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

});

forse alcune informazioni sulla querystring per ottenere una risposta completa
Schuere,

67

Aggiornamento: req.param() ora è obsoleto, quindi in futuro non utilizzare questa risposta.


La tua risposta è il modo preferito per farlo, tuttavia ho pensato di sottolineare che puoi anche accedere ai parametri url, post e route tutti con req.param(parameterName, defaultValue).

Nel tuo caso:

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

Dalla guida espressa:

la ricerca viene eseguita nel seguente ordine:

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

Nota che la guida afferma quanto segue:

L'accesso diretto a req.body, req.params e req.query dovrebbe essere preferito per chiarezza, a meno che non si accetti veramente l'input da ciascun oggetto.

Tuttavia, in pratica, ho scoperto req.param()di essere abbastanza chiaro e rende più semplici alcuni tipi di refactoring.


53

La stringa di query e i parametri sono diversi.

Devi utilizzare entrambi nell'URL di routing singolo

Si prega di controllare l'esempio che segue può esservi utile

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

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

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

});

Ottieni il link per passare il secondo segmento è il tuo esempio id: http: // localhost: port / sample / 123

In caso di problemi, utilizzare il passaggio di variabili come stringa di query utilizzando '?' operatore

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

     var id = req.query.id; 

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

    });

Ottieni link come questo esempio: http: // localhost: port / sample? Id = 123

Entrambi in un singolo esempio

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

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

});

Ottieni l'esempio di collegamento: http: // localhost: port / sample / 123? Id = 123


2
Grazie questa risposta è stata molto utile!
Bruno Tavares,

44

La risposta di @ Zugwait è corretta. req.param()è deprecato. Dovresti usare req.params, req.queryo req.body.

Ma solo per chiarire:

req.paramssarà popolato solo con i valori del percorso. Cioè, se hai un percorso simile /users/:id, puoi accedere ida in req.params.ido req.params['id'].

req.querye req.bodyverrà popolato con tutti i parametri, indipendentemente dal fatto che siano o meno nel percorso. Naturalmente, i parametri nella stringa di query saranno disponibili in req.querye i parametri in un corpo postale saranno disponibili in req.body.

Quindi, rispondendo alle tue domande, poiché colornon è presente nel percorso, dovresti essere in grado di ottenerlo utilizzando req.query.coloro req.query['color'].


17

Il manuale express dice che dovresti usare req.query per accedere a QueryString.

// 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
Grazie per questo frammento di codice, che potrebbe fornire un aiuto immediato e limitato. Una spiegazione adeguata migliorerebbe notevolmente il suo valore a lungo termine mostrando perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con altre domande simili. Si prega di modificare la risposta di aggiungere qualche spiegazione, tra le ipotesi che hai fatto.
iBug,

2

Una buona tecnica che ho iniziato a utilizzare con alcune delle mie app su express è quella di creare un oggetto che unisce i campi query, params e body dell'oggetto richiesta di 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;

Quindi, nel corpo del controller o in qualsiasi altro ambito della catena di richieste espresse, è possibile utilizzare qualcosa di simile al seguente:

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

Questo rende piacevole e pratico "approfondire" tutti i "dati personalizzati" che un utente potrebbe aver inviato con la sua richiesta.

Nota

Perché il campo 'oggetti di scena'? Poiché si trattava di uno snippet ridotto, utilizzo questa tecnica in diverse mie API, inoltre memorizzo i dati di autenticazione / autorizzazione su questo oggetto, esempio di seguito.

/*
 * @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
Questa è probabilmente una cattiva idea perché rende più difficile mantenere i tuoi endpoint. Non sai più quale metodo verranno utilizzati dai client per passare i parametri.
sdgfsdh,

Questo è in realtà uno dei principali vantaggi di questo approccio per essere onesti, non dover sapere da dove provengono i campi. La classe ExpressData sopra agisce come un ponte, permettendoti di modulare la tua logica aziendale, allontanandola dalle rotte del controller espresso, ovvero non stai inserendo "req.query", "req.body" nel tuo codice, questo rende anche il tuo codice aziendale facilmente testabile, completamente al di fuori di express.
Lee Brindley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.