从客户端创建JSON并将其发送到服务器以及预期结果

时间:2018-07-18 15:16:58

标签: javascript json node.js

我正在尝试从网页中解析用户输入,并使用内联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
    }
}

2 个答案:

答案 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
    }
);