नोडज - पहला तर्क स्ट्रिंग या बफर होना चाहिए - जब http.request के साथ प्रतिक्रिया का उपयोग करें


92

मैं बस एक नोड सर्वर बनाने की कोशिश कर रहा हूं जो किसी दिए गए URL की HTTP स्थिति को आउटपुट करता है।

जब मैं res.write के साथ प्रतिक्रिया को फ्लश करने की कोशिश करता हूं, तो मुझे त्रुटि मिलती है: नया टाइपइर्रोर फेंक दें ('पहला तर्क एक स्ट्रिंग या बफर होना चाहिए);

लेकिन अगर मैं उन्हें कंसोल.लॉग के साथ बदल देता हूं, तो सब कुछ ठीक है (लेकिन मुझे उन्हें ब्राउज़र पर लिखने की ज़रूरत है कंसोल नहीं)।

कोड है

var server = http.createServer(function (req, res) {
    res.writeHead(200, {"Content-Type": "text/plain"});

    request({
        uri: 'http://www.google.com',
        method: 'GET',
        maxRedirects:3
    }, function(error, response, body) {
        if (!error) {
            res.write(response.statusCode);
        } else {
            //response.end(error);
            res.write(error);
        }
    });     

    res.end();
});
server.listen(9999);

मेरा मानना ​​है कि मुझे एक कॉलबैक जोड़ना चाहिए लेकिन बहुत उलझन में है और किसी भी मदद की सराहना की जाती है।

जवाबों:


31

अनुरोध एक कॉलबैक विधि लेता है, इसका एसिंक्स! इसलिए मैं यह मान रहा हूं कि जब तक कॉलबैक निष्पादित नहीं होगा तब तक res.end()कॉल किया जा सकता है। कॉलबैक के भीतर अनुरोध को बंद करने का प्रयास करें।


1
किया और भी जोड़ा। बहुत धन्यवाद।
umutm

लगता है जैसे मैं भूल गया। बस कर दिया। धन्यवाद।
umutm

1
@umutm अधिक अच्छी तरह से लिखित और विस्तृत जवाब हैं, आपको शायद उनमें से एक को स्वीकार करना चाहिए; इस सवाल पर आने वाले किसी को भी दिखाई देना।
गौरव अग्रवाल 10

52

response.statusCodeएक संख्या है, उदाहरण के लिए response.statusCode === 200, नहीं '200'। जैसा कि त्रुटि संदेश कहता है, writeएक वस्तु stringया Bufferवस्तु की अपेक्षा करता है , इसलिए आपको इसे परिवर्तित करना होगा।

res.write(response.statusCode.toString());

हालांकि आप अपनी कॉलबैक टिप्पणी के बारे में भी सही हैं। res.end();आपके writeकॉल के ठीक नीचे कॉलबैक के अंदर होना चाहिए ।


हाँ, यह चाल है। एक नौसिखिया नौसिखिया के रूप में, पता नहीं था कि और बहुत बहुत धन्यवाद।
umutm

48

मुझे यह त्रुटि संदेश मिला है और इसमें विकल्पों का उल्लेख है

मेरे पास यह मूल रूप से था

request.post({
    url: apiServerBaseUrl + '/v1/verify',
    body: {
        email: req.user.email
    }
});

मैंने इसे इसे बदल दिया:

request.post({
    url: apiServerBaseUrl + '/v1/verify',
    body: JSON.stringify({
        email: req.user.email
    })
});

और यह त्रुटि संदेश के बिना अब काम करने लगता है ... हालांकि बग जैसा लगता है।

मुझे लगता है कि यह ऐसा करने का अधिक आधिकारिक तरीका है:

 request.post({
        url: apiServerBaseUrl + '/v1/verify',
        json: true,
        body: {
            email: req.user.email
        }
    });

4
आपकी समस्या अलग है, शरीर को डिफ़ॉल्ट रूप से एक स्ट्रिंग या बफर होने की उम्मीद है। आप इसे जोड़कर (json serializable होने के लिए) json जोड़ सकते हैं: विकल्पों के लिए सही। जैसे: request.post ({url: apiServerBaseUrl + '/ v1 / सत्यापित करें, बॉडी: {ईमेल: req.user.email}, json: true})
नूनो टॉमस

2
आप इस का उपयोग से बचने के लिए कर सकता है stringify javascript request.post({ url: apiServerBaseUrl + '/v1/verify', json: { email: req.user.email } }
bsorrentino

13

ठीक है, स्पष्ट रूप से आप कुछ ऐसा भेजने की कोशिश कर रहे हैं जो कोई स्ट्रिंग या बफर नहीं है। :) यह कंसोल के साथ काम करता है, क्योंकि कंसोल कुछ भी स्वीकार करता है। सरल उदाहरण:

var obj = { test : "test" };
console.log( obj ); // works
res.write( obj ); // fails

स्ट्रिंग में कुछ भी बदलने का एक तरीका यह है कि:

res.write( "" + obj );

जब भी आप कुछ भेजने की कोशिश कर रहे हैं। दूसरा तरीका है कॉल करना.toString() विधि है:

res.write( obj.toString( ) );

ध्यान दें कि यह अभी भी वह नहीं हो सकता है जिसे आप खोज रहे हैं। आपको हमेशा .writeऐसे ट्रिक्स के बिना स्ट्रिंग्स / बफ़र्स पास करना चाहिए ।

एक साइड नोट के रूप में: मैं मानता हूं कि requestएक एसिंक्रोनस ऑपरेशन है। यदि ऐसा है, तो res.end();किसी भी लेखन से पहले बुलाया जाएगा, अर्थात कोई भी लेखन वैसे भी विफल हो जाएगा (क्योंकि उस बिंदु पर कनेक्शन बंद हो जाएगा)। उस लाइन को हैंडलर में ले जाएं:

request({
    uri: 'http://www.google.com',
    method: 'GET',
    maxRedirects:3
}, function(error, response, body) {
    if (!error) {
        res.write(response.statusCode);
    } else {
        //response.end(error);
        res.write(error);
    }
    res.end( );
});

जवाब और विस्तृत जानकारी के लिए बहुत बहुत धन्यवाद। और, हां, मैंने रेसलर को हैंडलर में स्थानांतरित कर दिया है। मैंने @loganfsmyth को स्वीकार कर लिया है जैसा कि पहले था। Thx फिर से।
umutm

1

अगर आप प्रतिक्रिया के लिए JSON ऑब्जेक्ट लिखना चाहते हैं तो हेडर सामग्री प्रकार को एप्लिकेशन / json में बदलें

response.writeHead(200, {"Content-Type": "application/json"});
var d = new Date(parseURL.query.iso);
var postData = {
    "hour" : d.getHours(),
    "minute" : d.getMinutes(),
    "second" : d.getSeconds()
}
response.write(postData)
response.end();

1

और एक और संभावना है (इस मामले में नहीं) जब अजाक्स (XMLhttpRequest) के साथ काम करते समय, ग्राहक को वापस जानकारी भेजते समय आपको res.end (Responsetext) के बजाय res.send (Responsetext) का उपयोग करना चाहिए


1

यद्यपि प्रश्न हल हो गया है, लेकिन त्रुटि के सही अर्थ के स्पष्टीकरण के लिए ज्ञान साझा करना।

त्रुटि का कहना है कि संबंधित ब्रेकिंग फ़ंक्शन के लिए आवश्यक पैरामीटर आवश्यक प्रारूप अर्थात स्ट्रिंग या बफर में नहीं है

समाधान स्ट्रिंग को पैरामीटर बदलने के लिए है

breakingFunction(JSON.stringify(offendingParameter), ... other params...);

या बफर

breakingFunction(BSON.serialize(offendingParameter), ... other params...);

0

पहला तर्क टाइप स्ट्रिंग या बफ़र में से एक होना चाहिए। प्राप्त प्रकार की वस्तु

 at write_

मैं उपरोक्त त्रुटि की तरह हो रहा था जब मैं अनुरोध मॉड्यूल में शरीर के डेटा को पास कर रहा था।

मैंने एक और पैरामीटर पास किया है जो JSON है: सत्य और इसका कार्य।

var option={
url:"https://myfirstwebsite/v1/appdata",
json:true,
body:{name:'xyz',age:30},
headers://my credential
}
rp(option)
.then((res)=>{
res.send({response:res});})
.catch((error)=>{
res.send({response:error});})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.