请求POST修改对象?

时间:2017-04-10 08:11:06

标签: javascript node.js request

我尝试使用像这样的帖子发布对象 - >

function postData(data, cb) {
    request.post({
        url: 'http://localhost:3001/datastream',
        form: data,
    }, (err, httpResponse, body) => {
        cb(body);
    });
}

对象看起来像这样:

{
    "tblPartsReport": {
        "valid": true,
        "message": "Execute SQL: SELECT * FROM tblPartsReport WHERE ID = (SELECT MAX(ID) FROM tblPartsReport); success !",
        "records": [{
            "ResourceID": 61,
            "TimeStamp": "2017-04-04T05:52:19Z",
            "PNo": 0,
            "ErrorID": 0,
            "ID": 10174
        }]
    },
    "tblMachineReport": {
        "valid": true,
        "message": "Execute SQL: SELECT * FROM tblMachineReport WHERE ID = (SELECT MAX(ID) FROM tblMachineReport); success !",
        "records": [{
            "ResourceID": 61,
            "TimeStamp": "2017-04-04T05:52:19Z",
            "AutomaticMode": true,
            "ManualMode": false,
            "Busy": false,
            "Reset": false,
            "ErrorL0": false,
            "ErrorL1": false,
            "ErrorL2": false,
            "ID": 26562
        }]
    }
}

该对象有效且没问题,但在发布后,它在另一面看起来像这样:

console.log(req.body);

{
    'tblMachineReport[valid]': 'true',
    'tblMachineReport[message]': 'Execute SQL: SELECT * FROM tblMachineReport WHERE ID = (SELECT MAX(ID) FROM tblMachineReport); success !',
    'tblMachineReport[records][0][ResourceID]': '61',
    'tblMachineReport[records][0][TimeStamp]': '2017-04-04T05:52:19Z',
    'tblMachineReport[records][0][AutomaticMode]': 'true',
    'tblMachineReport[records][0][ManualMode]': 'false',
    'tblMachineReport[records][0][Busy]': 'false',
    'tblMachineReport[records][0][Reset]': 'false',
    'tblMachineReport[records][0][ErrorL0]': 'false',
    'tblMachineReport[records][0][ErrorL1]': 'false',
    'tblMachineReport[records][0][ErrorL2]': 'false',
    'tblMachineReport[records][0][ID]': '26562',
    'tblPartsReport[valid]': 'true',
    'tblPartsReport[message]': 'Execute SQL: SELECT * FROM tblPartsReport WHERE ID = (SELECT MAX(ID) FROM tblPartsReport); success !',
    'tblPartsReport[records][0][ResourceID]': '61',
    'tblPartsReport[records][0][TimeStamp]': '2017-04-04T05:52:19Z',
    'tblPartsReport[records][0][PNo]': '0',
    'tblPartsReport[records][0][ErrorID]': '0',
    'tblPartsReport[records][0][ID]': '10174'
}

知道为什么会这样吗?我也尝试过Axios,但无法使帖子正常工作。我只是想发布一个常规对象。通常我一直在使用jQuery AJAX。

编辑: 这是正确的方法:)

function postData(data, cb) {
    request.post({
        url: 'http://localhost:3001/datastream',
        json: true,
        body: data,
    }, (err, httpResponse, body) => {
        cb(body);
    });
}

1 个答案:

答案 0 :(得分:1)

我假设您使用节点模块请求。 您必须使用json选项而不是表单选项。 将json设置为true并将数据放入正文而不是表单。

  

body - 用于PATCH,POST和PUT请求的实体主体。必须是Buffer,String或ReadStream。如果json为true,则body必须是JSON可序列化的对象。

     

form - 当传递一个对象或一个查询字符串时,它将body设置为值的查询字符串表示,并添加Content-type:application / x-www-form-urlencoded标头。如果没有传递选项,则返回一个FormData实例(并通过管道传递请求)。请参阅"表格"以上部分。

https://github.com/request/request#requestoptions-callback

您在帖子中包含的输出格式为application/x-www-form-urlencoded,据我记得PHP和其他纯服务器端语言更喜欢这种格式。