代码之家  ›  专栏  ›  技术社区  ›  natn2323

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

  •  0
  • natn2323  · 技术社区  · 7 年前

    我正在尝试解析来自我的网页的用户输入,并使用内联javascript将其存储在json对象中,使 POST 请求my node.js服务器,并访问请求的内容。

    在我的 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));
    

    编辑:

    之后 岗位 请求,我有一个 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 回复  |  直到 7 年前
        1
  •  0
  •   Ted Fitzpatrick    7 年前

    使datatosubmit成为一个对象:

    datatosubmit={};

    对于每个输入行,向datatosubmit添加一个唯一键控属性,并为其分配一个对象:

    dataToSubmit['keyName' + index] = {}
    

    指定此新对象属性,如:

    dataToSubmit['keyName' + index]['item'] = itemName;
    dataToSubmit['keyName' + index]['quantity'] = quantity;
    dataToSubmit['keyName' + index]['price'] = itemPrice;
    
        2
  •  0
  •   natn2323    7 年前

    导致我无法访问 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
        }
    );