2013-09-29 27 views
0

我想了Twilio的請求參數格式正在返回JSON序列化數據--according爲響應回調部分(http://twilio.github.io/twilio-node/#restResources如何訪問特定的請求參數

列出的文檔。如果是這樣的話我以爲我可以使用JSON.parse訪問請求參數(特別是文本正文),如下所述...但是我沒有得到任何類型的響應。

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

http.createServer(function (req, res) { 

    var body = ''; 

    req.on('data', function(data) { 
    var messageBody = JSON.parse(data); 
    body += messageBody.body; 
    }); 

    req.on('end', function() { 
    //Create TwiML response 
    var twiml = new twilio.TwimlResponse(); 

    twiml.message('Thanks, your message of "' + body + '" was received!'); 

    res.writeHead(200, {'Content-Type': 'text/xml'}); 
    res.end(twiml.toString()); 
    }); 

}).listen(8080); 

在此之前,我曾嘗試訪問參數,如下圖所示......但正文文本總是返回「undefined」。

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

http.createServer(function (req, res) { 

    var body = ''; 

    req.on('data', function(data) { 
    body += data.body; 
    }); 

    req.on('end', function() { 
    //Create TwiML response 
    var twiml = new twilio.TwimlResponse(); 

    twiml.message('Thanks, your message of "' + body + '" was received!'); 

    res.writeHead(200, {'Content-Type': 'text/xml'}); 
    res.end(twiml.toString()); 
    }); 

}).listen(8080); 

如果我只是做body += data;然後我收到的所有組合在一起的請求參數的 - 我不需要。

想法?你能解釋一下如何訪問特定的請求參數嗎?

** * ** * ***修訂* ** * ** * ** 納入@六氰化物的建議後,我結束了用以下代碼工作

var http = require('http'); 
var twilio = require('twilio'); 
var qs = require('querystring'); 

http.createServer(function (req, res) { 

    var body = ''; 

    req.setEncoding('utf8'); 

    req.on('data', function(data) { 
    body += data; 
    }); 

    req.on('end', function() { 
    var data = qs.parse(body); 
    var twiml = new twilio.TwimlResponse(); 
    var jsonString = JSON.stringify(data); 
    var jsonDataObject = JSON.parse(jsonString); 
    twiml.message('Thanks, your message of ' + jsonDataObject.Body + ' was received!'); 
    res.writeHead(200, {'Content-Type': 'text/xml'}); 
    res.end(twiml.toString()); 
    }); 

}).listen(8080); 

回答

2

正如我在回答你的類似問題時,你必須等待整個迴應,然後才能對它做任何事情。當你從請求流接收數據:

var buf = ''; 
req.setEncoding('utf8'); 
req.on('data', function(chunk) { 
    buf += chunk; 
}); 

您收到原始數據。它是未處理的字節,尚未經過解析,您不知道它表示的數據總量有多少(除非您已檢查過內容長度標題)。這也意味着你不能使用JSON.parse(),因爲你會得到一段未知長度的數據,通常並不代表整個JSON字符串(如果它只是括號,或者長度非常短等) 。

即使接收到特定的請求參數,您也必須收到整個請求並解析它。來自熱門模塊Express的模塊(如bodyParser())是爲此目的而創建的。如果你不想使用模塊,只是收集請求,並解析它:

var buf = ''; 
req.setEncoding('utf8'); 
req.on('data', function(chunk) { 
    buf += chunk; 
}); 
req.on('end', function() { 
    var data = JSON.parse(buf); 
}); 
+0

再次感謝您的反饋,我一定會檢查出快速模塊;然而,與此同時,新的更改導致502插槽掛斷錯誤。你有任何建議修復插座掛斷錯誤?因爲我仍然無法解析參數。 – NateHill

+0

你在哪裏得到套接字掛斷? – hexacyanide

+0

不確定。我如何找到這些信息?不知道如何調試它,因爲你無法逐步完成每一步。代碼如上所述,並且您的建議得以實施。 – NateHill