我正在尝试从网页中解析用户输入,并使用内联JavaScript将其存储在JSON对象中,向Node.js服务器发出POST
请求,并访问请求的内容。
在我的example.html
中,我有一个执行以下操作的函数:
var xhttp = new XMLHttpRequest();
dataToSubmit = [];
// find some inputs
for ( /* each row of input */ ) {
dataToSubmit.push({
'item': itemName,
'quantity': quantity,
'price': itemPrice
});
}
xhttp.open("POST", "http://localhost:8080/menu", true);
xhttp.setRequestHeader('Content-Type', 'application/json');
xhttp.send(JSON.stringify(dataToSubmit));
在POST
请求之后,我有一个dispatcher.js
文件用于处理请求:
function(request, response) {
var qs = require('querystring');
var requestBody = '';
request.on('data', function(data) { requestBody += data; });
request.on('end', function() {
var qs = require('querystring');
var passed_data = qs.parse(requestBody);
if(request.url === "/menu") {
var menu_handler = require("./menu.js");
menu_handler.processOrder(passed_data);
}
}
我正在从我的processOrder()
导出menu.js
。问题是在服务器端,我必须执行以下操作才能访问该对象:
processOrder: function(data) {
for (var a in data) { <-------------- Having to do this seems incorrect
// a is a string, inputs is the expected object
var inputs = JSON.parse(a);
}
}
我的问题是:我创建JSON对象的方式不正确,还是我在服务器端访问它的方式不正确?我的期望是,在服务器端,我应该能够执行以下操作:
processOrder: function(data) {
var inputs = JSON.parse(data);
for (var input in inputs) {
// access to input.item, input.quantity, input.price
}
}
答案 0 :(得分:0)
使dataToSubmit对象:
dataToSubmit = {};
对于每个输入行,将唯一键属性添加到dataToSubmit中,并为其分配一个对象:
dataToSubmit['keyName' + index] = {}
分配此新对象属性,例如:
dataToSubmit['keyName' + index]['item'] = itemName;
dataToSubmit['keyName' + index]['quantity'] = quantity;
dataToSubmit['keyName' + index]['price'] = itemPrice;
答案 1 :(得分:0)
我无法将dataToSubmit
变量作为JSON对象访问的原因是,我在数据到达processOrder
函数之前在上一层进行了解析。解决方案是在我的dispatcher.js
文件中进行以下更改(该文件在最终以requestBody
的方式处理menu.js
之前):
function(request, response) {
var qs = require('querystring');
var requestBody = '';
request.on('data', function(data) { requestBody += data; });
request.on('end', function() {
var qs = require('querystring');
var passed_data;
if(request.headers['content-type'] === 'application/json') { <--- parse JSON data
passed_data = JSON.parse(requestBody);
else {
passed_data = qs.parse(requestBody);
}
if(request.url === "/menu") {
var menu_handler = require("./menu.js");
menu_handler.processOrder(passed_data);
}
}
此外,在创建JSON对象时,需要执行以下操作才能以JSON对象而不是数组的形式访问数据:
dataToSubmit = {'content': []};
dataToSubmit['content'].push(
{
'item': itemName,
'quantity': quantity,
'price': itemPrice
}
);