"के बाद जीईटी मापदंडों का उपयोग कैसे करें?" एक्सप्रेस में?


526

मुझे पता है कि इस तरह के प्रश्नों के लिए कैसे पाराम्स प्राप्त करें:

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

इस मामले में, मैं req.params.idपैरामीटर प्राप्त करने के लिए उपयोग कर सकता हूं (उदाहरण 2के लिए)/sample/2 )।

हालांकि, url के लिए /sample/2?color=red, मैं चर का उपयोग कैसे कर सकता हूंcolor ?

मैंने कोशिश की req.params.colorलेकिन यह काम नहीं किया।

जवाबों:


775

इसलिए, एक्सप्रेस संदर्भ को देखने के बाद , मैंने पाया किreq.query.color मुझे वह मूल्य वापस जाएगा मुझे तलाश है।

req.params URL में ':' के साथ आइटम को संदर्भित करता है और req.query '' से जुड़ी वस्तुओं को संदर्भित करता है?

उदाहरण:

GET /something?color1=red&color2=blue

तब व्यक्त में, हैंडलर:

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

क्या आप मुझे बता सकते हैं कि "आईडी" कैसे मान्य करें?
आनंद राज

1
@ आनंदराज: आपका क्या मतलब है: "आईडी" कैसे मान्य करें? आप किस तरह की मान्यता चाहते हैं? BTW, आप idइस तरह से अपने फ़ंक्शन का मान प्राप्त कर सकते हैं var sampleId = req.params.id;:।
जोकेम शुल्नेक्लोपर

4
req.params.whateverनवीनतम संस्करणों में उपयोग करें ।
एडेल्रियोसैंटियागो

3
मन जो req.paramsअलग है req.query! expressjs.com/en/api.html#req.params expressjs.com/en/api.html#req.query @adelriosantiago
caesarsol

81

मार्ग में क्वेरी स्ट्रिंग पैरामीटर में मान प्राप्त करने के लिए, req.query का उपयोग करें। Req.query का संदर्भ लें । यदि किसी मार्ग में कहें, http: // localhost: 3000 /? Name = satyam आप नाम पैरामीटर के लिए मान प्राप्त करना चाहते हैं, तो आपका 'गेट' मार्ग हैंडलर इस तरह से जाएगा: -

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

});

शायद कुछ के बारे में पूरी जानकारी प्राप्त करने के लिए querystring के बारे में जानकारी
Schuere

67

अद्यतन: req.param() अब पदावनत हो गया है, इसलिए आगे जाकर इस उत्तर का उपयोग न करें।


आपका उत्तर ऐसा करने का पसंदीदा तरीका है, हालांकि मैंने सोचा था कि मैं यह बताऊंगा कि आप सभी के साथ यूआरएल, पोस्ट, और रूट पैरामीटर भी एक्सेस कर सकते हैं req.param(parameterName, defaultValue)

आपके मामले में:

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

एक्सप्रेस गाइड से:

लुकअप निम्न क्रम में किया जाता है:

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

नोट करें कि गाइड निम्नलिखित बताती है:

Req.body, req.params, और req.query तक सीधी पहुंच स्पष्टता के पक्ष में होनी चाहिए - जब तक कि आप वास्तव में प्रत्येक ऑब्जेक्ट से इनपुट स्वीकार नहीं करते हैं।

हालांकि व्यवहार में मैंने वास्तव में req.param()पर्याप्त स्पष्ट पाया है और कुछ प्रकार के रिफैक्टिंग को आसान बनाता है।


53

क्वेरी स्ट्रिंग और पैरामीटर अलग हैं।

आपको एकल रूटिंग यूआरएल में दोनों का उपयोग करने की आवश्यकता है

कृपया नीचे दिए गए उदाहरण की जांच आपके लिए उपयोगी हो सकती है।

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

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

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

});

अपना दूसरा सेगमेंट पास करने के लिए लिंक प्राप्त करें आपका आईडी उदाहरण है: http: // localhost: port / sample / 123

यदि आप समस्या का सामना कर रहे हैं, तो कृपया 'स्ट्रिंग' के रूप में पासिंग चर का उपयोग करें? ऑपरेटर

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

     var id = req.query.id; 

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

    });

इस तरह अपना लिंक प्राप्त करें: http: // localhost: port / sample? Id = 123

दोनों एक ही उदाहरण में

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

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

});

लिंक उदाहरण प्राप्त करें: http: // localhost: port / sample / 123? Id = 123


2
धन्यवाद यह उत्तर बहुत मददगार था!
ब्रूनो टावारेस

44

@ जुगवैत का जवाब सही है। req.param()पदावनत किया गया है। आप का उपयोग करना चाहिए req.params, req.queryया req.body

लेकिन सिर्फ इसे स्पष्ट करने के लिए:

req.paramsकेवल मार्ग मूल्यों के साथ आबादी होगी। यही है, यदि आपके पास एक मार्ग है /users/:id, idतो आप req.params.idया तो में या एक्सेस कर सकते हैं req.params['id']

req.queryऔर चाहे वे मार्ग में हों या न हों, सभी परमों के req.bodyसाथ आबाद हो जाएंगे । बेशक, क्वेरी स्ट्रिंग में पैरामीटर उपलब्ध होंगे और एक पोस्ट बॉडी में पैरामीटर उपलब्ध होंगे ।req.queryreq.body

इसलिए, आपके प्रश्नों का उत्तर देना, जैसा colorकि मार्ग में नहीं है, आपको इसका उपयोग करने में सक्षम होना चाहिए req.query.colorया req.query['color']


17

एक्सप्रेस मैनुअल कहता है कि आपको QueryString तक पहुंचने के लिए req.query का उपयोग करना चाहिए ।

// 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
इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि समस्या का एक अच्छा समाधान क्यों है, यह दिखा कर इसके दीर्घकालिक मूल्य में बहुत सुधार होगा , और यह भविष्य के पाठकों को अन्य, समान प्रश्नों के साथ और अधिक उपयोगी बना देगा। कृपया अपने स्पष्टीकरण को संपादित करने के लिए कुछ स्पष्टीकरण जोड़ने के लिए, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
ugगू

2

एक अच्छी तकनीक जिसे मैंने एक्सप्रेस में अपने कुछ ऐप्स के साथ उपयोग करना शुरू किया है, वह एक ऑब्जेक्ट बनाने के लिए है जो एक्सप्रेस के अनुरोध ऑब्जेक्ट के क्वेरी, पैराम्स और बॉडी फ़ील्ड को मर्ज करता है।

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

फिर आपके नियंत्रक निकाय में, या कहीं और भी एक्सप्रेस अनुरोध श्रृंखला के दायरे में, आप नीचे कुछ का उपयोग कर सकते हैं:

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

यह अच्छा है और "कस्टम डेटा" के सभी "उपयोगकर्ता" उनके अनुरोध के साथ भेजा हो सकता है में "तल्लीन" करने के लिए आसान है।

ध्यान दें

'सहारा' क्षेत्र क्यों? क्योंकि यह एक कट-डाउन स्निपेट था, मैं इस तकनीक का उपयोग अपने कई एपीआई में करता हूं, मैं इस ऑब्जेक्ट पर प्रमाणीकरण / प्राधिकरण डेटा भी संग्रहीत करता हूं, उदाहरण के लिए नीचे।

/*
 * @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
यह शायद एक बुरा विचार है क्योंकि इससे आपके समापन बिंदुओं को बनाए रखना कठिन हो जाता है। अब आपको पता नहीं है कि ग्राहक किस पद्धति का उपयोग मापदंडों को पारित करने के लिए करेंगे।
sdgfsdh

यह वास्तव में इस दृष्टिकोण के मुख्य लाभों में से एक है ईमानदार होना, यह जानना नहीं है कि खेत कहाँ से आते हैं। एक्सप्रेसडेटा वर्ग एक पुल के रूप में कार्य करता है, जिससे आप अपने व्यापारिक तर्क को संशोधित कर सकते हैं, इसे एक्सप्रेस कंट्रोलर मार्गों से दूर ले जा सकते हैं, अर्थात आप अपने कोड में 'req.query', 'req.body' को बेक नहीं कर रहे हैं, यह भी बनाता है। आपके व्यवसाय कोड आसानी से परीक्षण योग्य, पूरी तरह से एक्सप्रेस के बाहर।
ली ब्रिंडली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.