2013-02-12 33 views
44

के साथ respond.write का उपयोग करते समय मैं बस एक नोड सर्वर बनाने की कोशिश कर रहा हूं जो किसी दिए गए यूआरएल की HTTP स्थिति को आउटपुट करता है।नोडजेस - पहला तर्क एक स्ट्रिंग या बफर होना चाहिए - http.request

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

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

कोड

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); 

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

उत्तर

8

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

+1

क्या उसने और जोड़ा .toString भी जोड़ा। बहुत धन्यवाद। – umutm

+0

@umutm क्यों ऊपर नहीं है? –

+0

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

40

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

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

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

+0

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

12

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

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

एक तरीका यह स्ट्रिंग के लिए कुछ भी परिवर्तित करने के लिए ऐसा करने के लिए है:

res.write("" + obj); 

जब भी आप कुछ भेजने की कोशिश कर रहे हैं।

res.write(obj.toString()); 

नोट यह अभी भी नहीं हो सकता है कि आप के लिए क्या देख रहे: दूसरी तरह .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(); 
}); 
+0

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

11

मैं यह त्रुटि संदेश मिलता है और यह options.body उल्लेख

मैं इस मूल

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

मैं यह करने के लिए इसे बदल दिया था:

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

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

+2

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

+0

आप इस का उपयोग कर सकता है से बचने के लिए * * stringify ** '' 'जावास्क्रिप्ट request.post ({ यूआरएल: apiServerBaseUrl + '/ v1/सत्यापित', json: { ईमेल: req.user.email } } ' '' – bsorrentino

0

की तरह लगता है अगर यू तो जवाबी कार्रवाई के लिए एक 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(); 
संबंधित मुद्दे