Jak uzyskać dostęp do parametrów GET po "?"in Express?

Wiem jak zdobyć params dla takich zapytań:

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

W tym przypadku mogę użyć req.params.id, Aby uzyskać parametr (np. 2 w /sample/2).

Jednak, dla url jak /sample/2?color=red, Jak mogę uzyskać dostęp do zmiennej color?

Próbowałem req.params.color ale nie zadziałało.

Author: nbro, 2013-06-09

8 answers

Więc, po sprawdzeniu express reference , odkryłem, że req.query.color zwróci mi wartość, której szukam.

 554
Author: Hanfei Sun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-09 12:15:01

Użyj req.query, do uzyskania wartości w parametrze ciągu zapytania w trasie. Refer req.query . Say if in a route, http://localhost:3000/?name=satyam chcesz uzyskać wartość parametru name, wtedy twój' Get ' będzie przebiegał w następujący sposób: -

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

});
 70
Author: satyam kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-28 17:00:55

Aktualizacja: req.param() jest obecnie przestarzały, więc w przyszłości nie używaj tej odpowiedzi.


Twoja odpowiedź jest preferowanym sposobem, aby to zrobić, jednak pomyślałem, że chciałbym zwrócić uwagę, że można również uzyskać dostęp do url, post, i parametry trasy wszystkie z req.param(parameterName, defaultValue).

W Twoim przypadku:

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

Z ekspresowego przewodnika:

Wyszukiwanie odbywa się w następującej kolejności:

    [[21]] req.params [[21]] req.body [[21]] req.zapytanie

Uwaga przewodnik podaje co następuje:

Bezpośredni dostęp do req.body, req.params, and req.zapytanie powinno być preferowane dla jasności-chyba, że naprawdę akceptujesz dane wejściowe z każdego obiektu.

Jednak w praktyce okazało się, że req.param() jest wystarczająco jasne i ułatwia niektóre rodzaje refaktoryzacji.

 63
Author: Zugwalt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-09 15:50:07

@Zugwait odpowiedź jest prawidłowa. req.param() jest przestarzały. Należy użyć req.params, req.query lub req.body.

Ale żeby było jaśniej:

req.params zostanie wypełniona tylko wartościami trasy. Oznacza to, że jeśli masz trasę podobną do /users/:id, możesz uzyskać dostęp do id albo w req.params.id lub req.params['id'].

req.query i req.body będzie wypełniona wszystkimi paramami, niezależnie od tego, czy znajdują się na trasie. Oczywiście parametry w łańcuchu zapytania będą dostępne w req.query i parametry w treści postu będą dostępne w req.body.

Więc, odpowiadając na twoje pytania, ponieważ color nie jest w trasie, powinieneś być w stanie uzyskać go za pomocą req.query.color lub req.query['color'].

 40
Author: André Pena,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-18 13:39:31

Ciąg zapytania i parametry są różne.

Musisz używać obu w jednym routingu url

Proszę sprawdzić poniższy przykład może być dla Ciebie przydatny.

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

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

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

});

Get the link to pass your second segment is your ID example: http://localhost:port/sample/123

Jeśli napotkasz problem, użyj zmiennych przekazujących jako ciąg zapytania za pomocą '?"operator

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

     var id = req.query.id; 

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

    });

Get link your like this example: http://localhost:port/sample?id=123

Zarówno w jednym przykładzie

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

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

});

Pobierz przykład linku: http://localhost:port/sample/123?id=123

 32
Author: Raja Rama Mohan Thavalam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-19 07:28:31

Instrukcja express mówi, że należy użyć req.query {[3] } aby uzyskać dostęp do QueryString.

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

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

});
 14
Author: Jan Biasi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-29 15:10:23
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!')
)
 5
Author: seme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-26 20:53:00

Fajną techniką, której używam w niektórych aplikacjach express, jest tworzenie obiektu, który łączy pola query, params i body obiektu request 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;

Następnie w ciele kontrolera, lub gdziekolwiek indziej w łańcuchu ekspresowych żądań, możesz użyć czegoś takiego jak poniżej:

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

To sprawia, że miło i wygodnie jest po prostu "zagłębić się "we wszystkie" niestandardowe dane", które użytkownik mógł wysłać ze swoim żądaniem.

Uwaga

Dlaczego pole rekwizytów? Ponieważ był to wycinek, używam tej techniki w wielu moich API, przechowuję również dane uwierzytelniania / autoryzacji na tym obiekcie, przykład poniżej.

/*
 * @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
Author: Lee Brindley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-09 08:51:29