2013-02-12 52 views
44

我只是試圖創建一個輸出給定URL的HTTP狀態的節點服務器。當我嘗試使用res.write刷新響應時,出現以下錯誤:throw new TypeError('第一個參數必須是字符串或緩衝區');nodejs - 第一個參數必須是字符串或緩衝區 - 使用http.request時使用response.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

請求採用回調方法,它的異步!所以我假設,到回調執行時res.end()可能會被調用。嘗試在回調中關閉請求?

+1

這是否也添加了.toString。非常感謝。 – umutm 2013-02-13 12:10:45

+0

@umutm爲什麼不是upvote? – 2016-12-20 09:52:58

+0

似乎我忘了。剛剛做到了。謝謝。 – umutm 2016-12-21 10:47:58

40

response.statusCode是一個數字,例如, response.statusCode === 200,而不是'200'。正如錯誤消息所述,write預計會出現stringBuffer對象,因此您必須對其進行轉換。

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

你也對你的回調評論是正確的。 res.end();應位於回撥內,正好位於您的write通話的下方。

+0

是的,這確實起作用。作爲一個nodejs新手,不知道這一點,並非常感謝。 – umutm 2013-02-13 12:08:10

12

好吧,顯然你正在嘗試發送一些不是字符串或緩衝區的東西。 :)它與控制檯一起工作,因爲控制檯可以接受任何東西簡單的例子:任何東西轉換成字符串

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(); 
}); 
+0

非常感謝您的回答和詳細信息。 而且,是的,我已將res.end移入處理程序。 我已經接受@loganfsmyth,因爲它早些時候。 Thx再次。 – umutm 2013-02-13 12:10:12

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

你的問題是不同的,身體默認預期是一個字符串或緩衝區。 你也可以改變它(要成爲json序列化)添加json:true選項。 如: request.post({ 網址:apiServerBaseUrl + '/ V1 /驗證', 正文:{電子郵件:req.user.email}, JSON:真 }) – 2017-04-05 10:45:51

+0

你可以利用這一點避免* * **字符串化 '''的JavaScript request.post({ 網址:apiServerBaseUrl + '/ V1 /驗證', JSON:{ 電子郵件:req.user.email }} ''' – bsorrentino 2017-07-18 08:32:47

0

如果u想要一個JSON對象寫入響應然後更改標題的內容類型爲application/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(); 
相關問題