2017-02-24 131 views
1

我試圖從一個本地nodejs(express)實例發送以下Javascript對象到另一個。JSON字符串在發佈後請求

var v = { 
    items: [{ 
     id: "fil1", 
     values: [ 
      { key: "123", timestamp: 333, value: "aaa" }, 
      { key: "123", timestamp: 333, value: "aaa" }, 
      { key: "123", timestamp: 333, value: "aaa" }, 
      { key: "123", timestamp: 333, value: "aaa" } 
     ] 
    }] 
}; 

我使用下面的發佈請求,其中request = require('request'),並params是上述目的v的JSON.stringified版本。

var performPostRequest = function (ip, port, endpoint, params, callback) { 
var url = "http://" + ip + ":" + port + "/" + endpoint; 
request.post({ 
    url: url, 
    form: params, 
    headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json' 
    } 
}, function (err, response, body) { 
    if (err) { 
     callback(err, body); 
    } 
    if (body) { 
     callback(err, JSON.parse(body)); 
    } 
}); 
}; 

接收端點看起來是這樣的:

router.post('/values', function (req, res) { 

    console.log(req.body); 

    res.status(201).send(""); 
}); 

如果路由器是express.Router()。

所以,我的問題:當打印JSON.stringify(v)在發送方,其結果是相匹配的物體V的字符串,但在接收端點打印請求的主體時,該字符串被弄亂了(見下文) 。我究竟做錯了什麼?

發件人

JSON.stringify(v)

{"items":[{"id":"fil1","values":[{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"}]}]} 

req.body在接收器:

{ '{"items":': { '{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"},{"key":"123","timestamp":333,"value":"aaa"}': '' } } 
+0

'params'是一個字符串? [請求文檔](https://www.npmjs.com/package/request#requestoptions-callback)表明'form'選項的值應該是對象或查詢字符串,而不是JSON字符串。你的意思是使用'body'嗎? –

回答

1

可以使用request使用json選項,完成所有的操作,發送JSON從request doc

json - 將body設置爲值的JSON表示並添加 Content-type:application/json標頭。此外,還將 響應正文解析爲JSON。

var request = require('request'); 

var options = { 
    url: url, 
    method: 'POST', 
    json: { 
     items: [{ 
      id: "fil1", 
      values: [ 
       { key: "123", timestamp: 333, value: "aaa" }, 
       { key: "123", timestamp: 333, value: "aaa" }, 
       { key: "123", timestamp: 333, value: "aaa" }, 
       { key: "123", timestamp: 333, value: "aaa" } 
      ] 
     }] 
    }; 
}; 

request(options, function(error, response, body) { 
    if (error) { 
     callback(err, body); 
    } 
    if (body) { 
     callback(error, body); 
    } 
}); 
+0

謝謝伯特蘭,我會試試。 json可以不使用「表單」選項嗎? – GINGERT

+0

從相同的[自述文件](https://github.com/request/request):'形式 - 當傳遞一個對象或查詢字符串時,它將身體設置爲查詢字符串表示形式的值,並添加Content-type:application/x-www-form-urlencoded頭。當傳遞任何選項時,返回一個FormData實例(並通過管道請求)'。所以不,它不應該用於Json數據,而是用於URL編碼數據 –