Express.js पर Node.js में GET (क्वेरी स्ट्रिंग) चर कैसे प्राप्त करें?


1190

क्या हम Node.js में क्वेरी स्ट्रिंग में वैरिएबल प्राप्त कर सकते हैं जैसे हम उन्हें $_GETPHP में प्राप्त करते हैं ?

मुझे पता है कि Node.js में हम अनुरोध में URL प्राप्त कर सकते हैं। क्या क्वेरी स्ट्रिंग पैरामीटर प्राप्त करने की कोई विधि है?


6
@ व्हाइटवार्क के उत्तर (सबसे अधिक वोट वाले) को सही उत्तर के रूप में चिह्नित किया जाना चाहिए। क्या आपके मन में दूसरों के लिए उसी सवाल को अपडेट करने का मन है जैसा कि आप अपने सवाल पर ठोकर खाते हैं?
देव ०१

एक्सप्रेस रिक्वेस्ट में क्वेरी ऑब्जेक्ट का उपयोग करें - यहाँ पर एक्सप्रेस रिक्वेस्ट क्वेरी का उपयोग
18'19 को drorw

@ Dev01 वह 2014 के बाद से सक्रिय नहीं हैं
जॉन बल्विन एरियस

अगर कोई भी Njjj एपीआई एक्सप्रेस बॉयलरप्लेट को एक्सप्रेसज और मोंगोबीडी के साथ देख रहा है। इसे आज़माएँ: github.com/maitraysuthar/rest-api-nodejs-mongodb
मैत्राय सुथार

जवाबों:


1177

एक्सप्रेस में यह आपके लिए पहले से ही है और आप बस इसके लिए req.query का उपयोग कर सकते हैं :

var id = req.query.id; // $_GET["id"]

अन्यथा, NodeJS में, आप req.url और बिल्टिनurl मॉड्यूल को [url.parse] ( https://nodejs.org/api/url.html#url_url_parse_urlster_parftererystring_slashesdenotehost ) पर मैन्युअल रूप से एक्सेस कर सकते हैं :

var url = require('url');
var url_parts = url.parse(request.url, true);
var query = url_parts.query;

24
यहाँ ध्यान: .parse (यूआरएल, सच ) url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
befzz

क्या अतिरिक्त / बेहतर कार्यक्षमता hapi प्रदान करता है (यदि कोई हो)?
बलतोस्टर

180
यह स्वीकार किया जाता है लेकिन यह पसंदीदा उत्तर नहीं है। निचे देखो! उपयोगreq.query
चीजो

2
नीचे mikemcneil का उत्तर एक बेहतर विकल्प है। का प्रयोग करें req.queryया req.param(जो अलग है req.params... नीचे देखें।
माइंडज्यूइस

9
-1 । ऊपर कोड एक डेडवेट है - कुछ अच्छा डेवलपर मौके पर रिफ्लेक्टर करेगा। यह " URL का क्वेरी स्ट्रिंग कैसे प्राप्त करें? " का उत्तर है - प्रश्न में URL केवल नाम की एक वस्तु में होता है requestऔर इसका एक्सप्रेस से कोई लेना-देना नहीं है। नीचे @ whitequark का उत्तर देखें (उपयोग करें request.query)
lunohodov

1648

चूंकि आपने अपने टैग में Express.js का उल्लेख किया है, इसलिए यहां एक एक्सप्रेस-विशिष्ट उत्तर है: req.query का उपयोग करें । उदाहरण के लिए

var express = require('express');
var app = express();

app.get('/', function(req, res){
  res.send('id: ' + req.query.id);
});

app.listen(3000);

67
वर्थ उल्लेख है कि आपको उपयोग करना चाहिए req.query.id, ब्रैकेट नोटेशन का उपयोग करने की आवश्यकता नहीं है।
एलेक्स

एक्सप्रेस स्थापित करने के लिए यह करें: हाँ | sudo npm install -g express --- मैंने एडिट करने की कोशिश की लेकिन एलेक्सिस किंग को वापस कर दिया गया है।
फेलिप

सवाल में वह एक सरणी की तरह सभी क्वेरी स्ट्रिंग पैरामीटर प्राप्त करने के लिए एक रास्ता तलाश रहा था। सही उत्तर यह है: app.get ('/', function (req, res) {कंसोल.लॉग (req .query);});
रिचर्ड टोरकाटो

463

एक्सप्रेस में, उपयोग करें req.query

req.paramsकेवल रूट पैरामीटर मिलता है, क्वेरी स्ट्रिंग पैरामीटर नहीं। एक्सप्रेस या पाल दस्तावेज देखें :

(req.params) चेक मार्ग मार्ग, पूर्व: / उपयोगकर्ता /: आईडी

(req.query) क्वेरी स्ट्रिंग स्ट्रिंग params, उदा: id? 12 = urlencoded body params चेक करता है

(req.body), उदा: id = 12 urlencoded अनुरोध निकायों का उपयोग करने के लिए, req.body एक ऑब्जेक्ट होना चाहिए। यह _express.bodyParser मिडलवेयर का उपयोग करके किया जा सकता है।

उस ने कहा, ज्यादातर समय, आप इसके स्रोत के बावजूद एक पैरामीटर का मूल्य प्राप्त करना चाहते हैं। उस मामले में, का उपयोग करें req.param('foo')

पैरामीटर का मान लौटाया जाएगा कि क्या चर मार्ग पैरामीटर, क्वेरी स्ट्रिंग या एन्कोडेड अनुरोध निकाय में था।

साइड नोट- यदि आप तीनों प्रकार के अनुरोध पैरामीटर (PHP के समान $_REQUEST) के चौराहे को प्राप्त करने का लक्ष्य बना रहे हैं , तो आपको बस मापदंडों को एक साथ मिलाने की आवश्यकता है- यहाँ बताया गया है कि कैसे मैंने इसे Sails में सेट किया है । ध्यान रखें कि पथ / मार्ग पैरामीटर ऑब्जेक्ट ( req.params) में सरणी गुण हैं, इसलिए ऑर्डर मायने रखता है (हालांकि यह एक्सप्रेस 4 में बदल सकता है )


req.param ('STRING') सही उत्तर है। यहाँ देखें: stackoverflow.com/questions/17007997/… (नीचे दिए गए उत्तर की ओर स्क्रॉल करें)
जोसेफ जुहानेके 20

3
@deltab यहाँ का लिंक है req.params: पाल डॉक्स में sailsjs.org/#/documentation/reference/req/req.params.html और नई एक्सप्रेस डॉक्स: expressjs.com/4x/api.html#req.params
mikermcneil

7
req.param एक्सप्रेस 4.x में हटाई गई है, req.params, req.body या req.query बजाय का उपयोग करना चाहिए: expressjs.com/en/4x/api.html#req.param
swang

@swang सही है- मैंने इस बारे में हाल ही में डग विल्सन के साथ डबल-चेक किया, और हेल्प req.param()फंक्शन को एक्सप्रेस 5 में पूरी तरह से हटा दिए जाने की संभावना है। यह 2017 में कुछ समय बाद तक आसन्न नहीं होगा, इसलिए मैं संपादित करने का इंतजार करूंगा यह जवाब तब तक। औसत समय में: req.param()एक्सप्रेस <= 3.x / Sails <= 0.12 के साथ उपयोग करना सुरक्षित है , और एक्सप्रेस 4 के नवीनतम उपलब्ध रिलीज के साथ, w / पदावनत लॉग संदेश। (Sails उपयोगकर्ताओं के लिए: का कार्यान्वयन req.param()
SAIL

142

Express.js के लिए आप क्या करना चाहते हैं req.params:

app.get('/user/:id', function(req, res) {
  res.send('user' + req.params.id);    
});

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

6
@Andy req.params बेहतर है क्योंकि: req.param (नाम [, डिफ़ॉल्ट]) होगा: वर्तमान या डिफ़ॉल्ट होने पर परम नाम का मान लौटाएं। मार्ग की जाँच करता है params (req.params), पूर्व: / उपयोगकर्ता /: आईडी जाँच क्वेरी स्ट्रिंग params (req.query), पूर्व: id? निकायों, req.body एक वस्तु होनी चाहिए। यह _express.bodyParser मिडलवेयर का उपयोग करके किया जा सकता है।
क्रिस्-ओ

मुझे नहीं पता था कि req.param req.query के लिए जाँच करता है, इस नोट के लिए धन्यवाद।
बेन सिंक्लेयर

3
req.param ('पैरामीटरनाम') req.body, req.query और req.params के लिए जाँच करेगा, लेकिन यदि आप सभी क्वेरी पैरामीटर ऑब्जेक्ट के रूप में चाहते हैं, तो आपको req.query का उपयोग करना चाहिए।
mikermcneil

1
@mikermcneil आपने शायद req.param () और req.params (ऑब्जेक्ट) को मिलाया है। एक्सप्रेस के अनुसार डॉक्स req.param () सभी तीन वस्तुओं में मूल्य की तलाश करता है। expressjs.com/api.html#req.param
बेन सिंक्लेयर

78

मैंने अन्य उत्तरों से सीखा और अपनी साइट में इस कोड का उपयोग करने का निर्णय लिया:

var query = require('url').parse(req.url,true).query;

तब आप सिर्फ कॉल कर सकते हैं

var id = query.id;
var option = query.option;

जहां पाने के लिए URL होना चाहिए

/path/filename?id=123&option=456

2
आईडी और विकल्प अपरिभाषित नहीं होगा क्योंकि क्वेरी सिर्फ एक स्ट्रिंग है? हम एक regex या इस तरह के साथ दो अलग मापदंडों बाहर पार्स करने के लिए होगा।
ओससेक

1
@ossek मेरा मानना ​​है कि किसी वस्तु parseपर req.urlधर्मान्तरित होने का कारण है ।
वाइटफिन

1
@ossek, वह url.parse करने के लिए एक दूसरा तर्क है, जो किसी ऑब्जेक्ट को क्वेरी संपत्ति बिंदु बनाता है के रूप में सही प्रदान की जाती है (और है कि आंतरिक रूप से querystring का उपयोग करता है मॉड्यूल) आप डॉक्स [यहां] (में इसके बारे में अधिक प्राप्त कर सकते हैं nodejs.org/docs / नवीनतम / एपीआई /… )
भारत

काम किया .... बहुत धन्यवाद !!!
प्रतीक गुप्ता

50
//get query&params in express

//etc. example.com/user/000000?sex=female

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

  const query = req.query;// query = {sex:"female"}

  const params = req.params; //params = {id:"000000"}

})

48

यदि आप ES6 और Express का उपयोग कर रहे हैं , तो इस destructuringदृष्टिकोण की कोशिश करें :

const {id, since, fields, anotherField} = request.query;

प्रसंग में:

const express = require('express');
const app = express();

app.get('/', function(req, res){
   const {id, since, fields, anotherField} = req.query;
});

app.listen(3000);

आप डिफ़ॉल्ट मान का destructuringभी उपयोग कर सकते हैं :

// sample request for testing
const req = {
  query: {
    id: '123',
    fields: ['a', 'b', 'c']
  }
}

const {
  id,
  since = new Date().toString(),
  fields = ['x'],
  anotherField = 'default'
} = req.query;

console.log(id, since, fields, anotherField)


डिफ़ॉल्ट मूल्यों के साथ विनाशकारी वस्तु का उपयोग करना! +1
लीड डेवलपर

43

जीईटी

विधि 1 के माध्यम से मापदंडों को पारित करने के 2 तरीके हैं : एमवीसी दृष्टिकोण जहां आप मापदंडों को पास करते हैं जैसे / रूनाम / /: पैरामनाम
इस मामले में आप पैरामीटर मान प्राप्त करने के लिए req.params.paramname का उपयोग कर सकते हैं। उदाहरण के लिए कोड का संदर्भ लें जहां मैं मुझे उम्मीद है कि ईद एक परम
कड़ी के रूप में हो सकती है: http://myhost.com/items/23

var express = require('express');
var app = express();
app.get("items/:id", function(req, res) {
    var id = req.params.id;
    //further operations to perform
});
app.listen(3000);

विधि 2: सामान्य दृष्टिकोण: ''? ऑपरेटर
उदाहरण के लिए नीचे दिए गए कोड का संदर्भ दें जहां मैं ईद की उम्मीद कर रहा हूं एक क्वेरी पैरामीटर
लिंक की तरह हो सकता है: http://myhost.com/items?id=23

var express = require('express');
var app = express();
app.get("/items", function(req, res) {
    var id = req.query.id;
    //further operations to perform
});
app.listen(3000);

40

आपको ऐसा कुछ करने में सक्षम होना चाहिए:

var http = require('http');
var url  = require('url');

http.createServer(function(req,res){
    var url_parts = url.parse(req.url, true);
    var query = url_parts.query;

    console.log(query); //{Object}

    res.end("End")
})

26

अद्यतन 4 मई 2014

पुराना उत्तर यहां संरक्षित है: https://gist.github.com/stefek99/b10ed037d2a4a326dd38


1) स्थापित एक्सप्रेस: npm install express

app.js

var express = require('express');
var app = express();

app.get('/endpoint', function(request, response) {
    var id = request.query.id;
    response.end("I have received the ID: " + id);
});

app.listen(3000);
console.log("node express app started at http://localhost:3000");

2) ऐप चलाएं: node app.js

3) ब्राउज़र में जाएँ: http://localhost:3000/endpoint?id=something

मुझे आईडी मिली है: कुछ


(मेरे उत्तर से कई चीजें बदल गई हैं और मेरा मानना ​​है कि यह चीजों को अद्यतन रखने के लायक है)


20

एक छोटा सा Node.js HTTP सर्वर पोर्ट 9080 पर सुन रहा है, GET या POST डेटा पार्स कर रहा है और प्रतिक्रिया के भाग के रूप में क्लाइंट को वापस भेज रहा है:

var sys = require('sys'),
url = require('url'),
http = require('http'),
qs = require('querystring');

var server = http.createServer(

    function (request, response) {

        if (request.method == 'POST') {
                var body = '';
                request.on('data', function (data) {
                    body += data;
                });
                request.on('end',function() {

                    var POST =  qs.parse(body);
                    //console.log(POST);
                    response.writeHead( 200 );
                    response.write( JSON.stringify( POST ) );
                    response.end();
                });
        }
        else if(request.method == 'GET') {

            var url_parts = url.parse(request.url,true);
            //console.log(url_parts.query);
            response.writeHead( 200 );
            response.write( JSON.stringify( url_parts.query ) );
            response.end();
        }
    }
);

server.listen(9080);

इसे सहेजें parse.js, और कंसोल पर "नोड पार्स.जेएस" दर्ज करके चलाएं।


3
आपको इस उदाहरण में sys की आवश्यकता नहीं है
danwellman

20

व्हाइटवार्क ने अच्छी प्रतिक्रिया दी। लेकिन Node.js और Express.js के वर्तमान संस्करणों के साथ इसे एक और पंक्ति की आवश्यकता है। 'आवश्यक http' (दूसरी पंक्ति) जोड़ना सुनिश्चित करें। मैंने यहां एक फुलर उदाहरण पोस्ट किया है जो दिखाता है कि यह कॉल कैसे काम कर सकता है। एक बार चलने के बाद, http://localhost:8080/?name=abel&fruit=appleअपने ब्राउज़र में टाइप करें, और आपको कोड के आधार पर एक शानदार प्रतिक्रिया मिलेगी।

var express = require('express');
var http = require('http');
var app = express();

app.configure(function(){
    app.set('port', 8080);
});

app.get('/', function(req, res){
  res.writeHead(200, {'content-type': 'text/plain'});
  res.write('name: ' + req.query.name + '\n');
  res.write('fruit: ' + req.query.fruit + '\n');
  res.write('query: ' + req.query + '\n');
  queryStuff = JSON.stringify(req.query);
  res.end('That\'s all folks'  + '\n' + queryStuff);
});

http.createServer(app).listen(app.get('port'), function(){
    console.log("Express server listening on port " + app.get('port'));
})

15

यह बहुत आसान है:

उदाहरण URL:

http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK

आप उपयोग करके क्वेरी स्ट्रिंग के सभी मान मुद्रित कर सकते हैं:

console.log("All query strings: " + JSON.stringify(req.query));

उत्पादन

सभी क्वेरी तार: {"id": "3", "सक्रियक": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvsz fUrqLrgS3zXJVfVRK"}

विशिष्ट प्रिंट करने के लिए:

console.log("activatekey: " + req.query.activatekey);

उत्पादन

सक्रिय करें: $ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjzfUrqLrgS3zXJVfVKK



13

आप एक्सप्रेस ^ 4.15.4 के साथ उपयोग कर सकते हैं:

var express = require('express'),
    router = express.Router();
router.get('/', function (req, res, next) {
    console.log(req.query);
});

उम्मीद है की यह मदद करेगा।


6

में express.jsआप यह बहुत आसान हो सकता है, सब आप अपने नियंत्रक समारोह में क्या करने की जरूरत है:

app.get('/', (req, res, next) => {
   const {id} = req.query;
   // rest of your code here...
})

और यह सब, आप संभालने के es6 वाक्यविन्यास का उपयोग कर रहे हैं।

पीडी। {id}के लिए खड़ा है Object destructuring, एक नई es6 सुविधा।


मैं नोड के साथ एक्सप्रेस का उपयोग कर रहा हूं इसलिए यह मेरे लिए पूरी तरह से काम करता है। धन्यवाद!
user752746

4
app.get('/user/:id', function(req, res) {
    res.send('user' + req.params.id);    
});

आप इसका उपयोग कर सकते हैं या आप अनुरोध पैरामीटर से विशेष तत्व को पार्स करने के लिए बॉडी-पार्सर की कोशिश कर सकते हैं।


1
क्या आप आगे बता सकते हैं कि यह प्रश्न का उत्तर कैसे देता है?
निको हसे

और यह एक मौजूदा पैरामीटर सूची को कैसे पार्स करता है?
निको हासे


1

यह वास्तव में सरल है:

const express= require('express');
const app = express();

app.get('/post', (req, res, next) => {
  res.send('ID:' + req.query.id + ' Edit:'+ req.query.edit);
});

app.listen(1000);

// localhost:1000/post?id=123&edit=true
// output: ID: 123 Edit: true

0

आप url.parse का उपयोग करके मापदंडों को इकट्ठा करने के लिए url मॉड्यूल का उपयोग कर सकते हैं

var url = require('url');
var url_data = url.parse(request.url, true);
var query = url_data.query;

इसके द्वारा किए गए एक्सप्रेस में,

var id = req.query.id;

उदाहरण के लिए:

var express = require('express');
var app = express();

app.get('/login', function (req, res, next) {
    console.log(req.query);
    console.log(req.query.id); //Give parameter id
});

0

एक्सप्रेस में, हम बस का उपयोग कर सकते हैं req.query.<name>। यह $_GET['name']PHP के समान ही काम करता है ।


0

अपने दृष्टिकोण से मुझे लगता है कि कई लोग दो अलग-अलग अवधारणाओं को मिलाते हैं। REST विकास के दौरान मैं URL में दो तरीकों "पथ चर" और "अनुरोध पैरामीटर" (क्वेरी पैरामीटर) के साथ जानकारी से परिचित था। RFC ने URI के हिस्सों का वर्णन इस तरह किया है: लिंक विवरण यहां दर्ज करें तो मैं समझ गया कि लेखक यह जानना चाहेंगे कि अनुरोध पैरामीटर कैसे पारित करें। मैं केवल विषय को समझना आसान बनाना चाहता हूं, लेकिन समाधान का उल्लेख यहां कई बार किया गया था।

आप URI से क्वेरी पैरामीटर प्राप्त कर सकते हैं request.query.<name of the parameter>, दूसरा उल्लेखित समाधान था request.params.<name of the parameter>और इसके साथ आप पथ चर प्राप्त कर सकते हैं।


0

तो, दो तरीकों से यह "आईडी" प्राप्त किया जा सकता है: 1) परम का उपयोग करते हुए: कोड params कुछ इस तरह दिखाई देगा: कहें कि हमारे पास एक सरणी है;

const courses = [{
    id: 1,
    name: 'Mathematics'
},
{
    id: 2,
    name: 'History'
}
];

तो फिर परम के लिए हम कुछ ऐसा कर सकते हैं:

app.get('/api/posts/:id',(req,res)=>{
    const course = courses.find(o=>o.id == (req.params.id))
    res.send(course);
});

2) क्वेरी पैरामीटर का उपयोग करने के लिए एक और विधि है। इसलिए url कुछ ऐसा दिखाई देगा जैसे "..... \ api \ xyz? id = 1" कहाँ "? id = 1" क्वेरी भाग है। इस मामले में हम कुछ ऐसा कर सकते हैं:

app.get('/api/posts',(req,res)=>{
    const course = courses.find(o=>o.id == (req.query.id))
    res.send(course);
});


0

यदि आपको कभी भी GETअनुरोध भेजने की आवश्यकता हो और IPसाथ ही Domain(अन्य जवाबों में यह उल्लेख नहीं किया गया है कि आप किसी portचर को निर्दिष्ट कर सकते हैं ), तो आप इस फ़ंक्शन का उपयोग कर सकते हैं:

function getCode(host, port, path, queryString) {
    console.log("(" + host + ":" + port + path + ")" + "Running httpHelper.getCode()")

    // Construct url and query string
    const requestUrl = url.parse(url.format({
        protocol: 'http',
        hostname: host,
        pathname: path,
        port: port,
        query: queryString
    }));

    console.log("(" + host + path + ")" + "Sending GET request")
    // Send request
    console.log(url.format(requestUrl))
    http.get(url.format(requestUrl), (resp) => {
        let data = '';

        // A chunk of data has been received.
        resp.on('data', (chunk) => {
            console.log("GET chunk: " + chunk);
            data += chunk;
        });

        // The whole response has been received. Print out the result.
        resp.on('end', () => {
            console.log("GET end of response: " + data);
        });

    }).on("error", (err) => {
        console.log("GET Error: " + err);
    });
}

अपनी फ़ाइल के शीर्ष पर आवश्यक मॉड्यूल याद न करें:

http = require("http");
url = require('url')

यह भी ध्यान में रखें कि आप httpsसुरक्षित डोमेन और एसएसएल पर संचार के लिए मॉड्यूल का उपयोग कर सकते हैं । इसलिए ये दो लाइनें बदल जाएंगी:

https = require("https");
...
https.get(url.format(requestUrl), (resp) => { ......

-1

सर्वर कोड के साथ क्यों नहीं मिलाया गया

उदा। php

<script>
var ip=<?php echo($_SERVER['REMOTE_ADDR']);?>

</script>

-2

मैं एक्सप्रेस ०.४.१६ के साथ ०.१.० मीन्स का उपयोग कर रहा हूं, यह अच्छा है

ग्राहक:

नियंत्रक:

var input = { keyword: vm.keyword };
ProductAPi.getOrder(input)

सेवाएं:

this.getOrder = function (input) {return $http.get('/api/order', { params: input });};

सर्वर

मार्गों

app.route('/api/order').get(products.order);

नियंत्रक

exports.order = function (req, res) {
  var keyword = req.query.keyword
  ...

-3

-------- क्वेरी स्ट्रिंग डेटा तक पहुँच -------
मान लें कि यह लिंक है http://webapplog.com/search?term=node.js&page=1

तो एक्सप्रेस में आप उपयोग कर सकते हैं:

  • req.query.term
  • req.query.page या
  • req.query(यह किसी ऑब्जेक्ट में क्वेरी लाएगा)

    // उदाहरण
    app.get('http://webapplog.com/search?term=node.js&page=1',(req, res)=>{ res.json({term:req.query.term, page:req.query.page}) })

-------- एक्सेस करने वाले URL पैरामीटर -------
मान लीजिए कि यह लिंक है http://webapplog.com/node.js/pages/100
तो एक्सप्रेस में आप उपयोग कर सकते हैं: app.get('/:term/pages/:page',....)

  • req.params.term
  • req.params.page

    // उदाहरण
    app.get('http://webapplog.com/:term/pages/:page',(req, res)=>{ res.json({term:req.params.term, page:req.params.page}) })
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.