Wie erreiche ich die GET-Parameter nach “?” In Express?

Ich weiß, wie man die Parameter für solche Abfragen bekommt:

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

In diesem Fall kann ich req.params.id , um den Parameter zu erhalten (zB 2 in /sample/2 ).

Wie kann ich aber für die URL wie /sample/2?color=red auf die variable color zugreifen?

Ich habe req.params.color aber es hat nicht funktioniert.

Nachdem ich die ausdrückliche Referenz req.query.color , stellte ich fest, dass req.query.color mir den Wert req.query.color , den ich suchte.

Verwenden Sie req.query, um den Wert im Abfragezeichenfolgenparameter in der Route abzurufen. Siehe Anfrage . Sagen Sie, wenn in einer Route, http: // localhost: 3000 /? Name = satyam Sie Wert für Name Parameter erhalten möchten, dann wird Ihre ‘Get’ Route Handler so gehen:

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

Update: req.param() ist jetzt veraltet, daher wird diese Antwort nicht verwendet.


Ihre Antwort ist der bevorzugte Weg, aber ich dachte, ich würde darauf hinweisen, dass Sie auch mit req.param(parameterName, defaultValue) , Post- und Route-Parameter req.param(parameterName, defaultValue) .

In Ihrem Fall:

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

Aus dem Express-Führer:

Die Suche wird in der folgenden Reihenfolge durchgeführt:

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

Beachten Sie, dass der Guide Folgendes angibt:

Direkter Zugriff auf req.body, req.params und req.query sollte aus Gründen der Übersichtlichkeit bevorzugt werden – es sei denn, Sie akzeptieren wirklich Eingaben von jedem Objekt.

In der Praxis habe ich jedoch gefunden, dass req.param() klar genug ist und bestimmte Refactoring-Typen erleichtert.

@ Zugwaits Antwort ist richtig. req.param() ist veraltet. Sie sollten req.params , req.query oder req.body .

Aber um es klarer zu machen:

req.params wird nur mit den req.params . Das heißt, wenn Sie eine Route wie /users/:id , können Sie entweder in req.params.id oder req.params['id'] auf die id req.params.id .

req.query und req.body werden mit allen Parametern gefüllt, unabhängig davon, ob sie sich in der Route befinden oder nicht. Natürlich sind die Parameter in der Query-Zeichenfolge in req.query verfügbar, und die Parameter in einem Post-Body sind in req.body verfügbar.

req.query.color du also deine Fragen beantwortest, weil die color nicht in der Route ist, solltest du sie mit req.query.color oder req.query['color'] .

Hey Query String und Parameter sind unterschiedlich.

Sie müssen beide in der einzelnen Routing-URL verwenden

Bitte überprüfen Sie unten Beispiele, die Ihnen hilfreich sein können.

 app.get('/sample/:id', function(req, res) { var id = req.params.id; //or use req.param('id') ................ }); 

Link erhalten Das zweite Segment ist Ihr ID-Beispiel: http: // localhost: port / file-upload / 123

Wenn Sie Probleme haben, verwenden Sie bitte Passing-Variablen als Abfragezeichenfolge mit ‘?’ Operator

  app.get('/sample', function(req, res) { var id = req.query.id; ................ }); 

Gehen Sie wie folgt vor: http: // localhost: port / sample? Id = 123

Beide in einem einzigen Beispiel

 app.get('/sample/:id', function(req, res) { var id = req.params.id; //or use req.param('id') var id2 = req.query.id; ................ }); 

Beispiel für ein Post-Link-Beispiel: http: // localhost: port / sample / 123? Id = 123

Das Express-Handbuch besagt, dass Sie req.query verwenden sollten, um auf den QueryString zuzugreifen.

 // Requesting /display/post?size=small app.get('/display/post', function(req, res, next) { var isSmall = req.query.size === 'small'; // > true // ... }); 
 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!') ) 

Eine nette Technik, die ich mit einigen meiner Apps für Express verwendet habe, ist ein Objekt zu erstellen, das die Abfrage-, Parameter- und Körperfelder des Anfrageobjekts von express zusammenführt.

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

Dann können Sie in Ihrem Controller-Body oder irgendwo anders im Bereich der Express-Anfrage-Kette Folgendes verwenden:

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

Dies macht es nett und praktisch, sich einfach in alle “benutzerdefinierten Daten” zu vertiefen, die ein Benutzer möglicherweise mit seiner Anfrage gesendet hat.

Hinweis

Warum das “Requisiten” -Feld? Da dies ein Schnipsel war, verwende ich diese Technik in einer Reihe meiner APIs. Ich speichere auch Authentifizierungs- / Autorisierungsdaten auf diesem Objekt, Beispiel unten.

 /* * @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"; } }