发送POST请求时,Node.js请求承诺错误?

时间:2018-12-28 17:20:34

标签: node.js request

当我尝试发送发布请求时,使用通过npm安装的请求承诺模块,我收到一个错误,并且我无法弄清原因。

我尝试删除部分选项和标题,但说实话,我只是被卡住了。

    function sendData() {
        var options = {
            method: 'POST',
            uri: `http://www.myurl.com/placeholder.json`,
            body: {
                "data":"desiredData"
            },
            headers: {
                "Accept": "application/json",
                "Accept-Encoding": "gzip, deflate",
                "Accept-Language": "en-US,en;q=0.9",
                "Connection": "keep-alive",
                "Content-Type": "application/x-www-form-urlencoded",
                "X-Requested-With": "XMLHttpRequest"
            }
        }
        rp(options)
            .then(function (parsedBody) {
                console.log(parsedBody)
            })
            .catch(function (err) {
                console.log(err)
            });
    }

sendData();

应该发送一个发布请求并记录返回的json,但我收到以下错误:

_http_outgoing.js:654
    throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'first argument',
    ^

TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be one of type string or Buffer
    at write_ (_http_outgoing.js:654:11)
    at ClientRequest.write (_http_outgoing.js:629:10)
    at Request.write (C:\Users\ninja_000\Desktop\TronJS\node_modules\request\request.js:1500:27)
    at end (C:\Users\ninja_000\Desktop\TronJS\node_modules\request\request.js:549:18)
    at Immediate.<anonymous> (C:\Users\ninja_000\Desktop\TronJS\node_modules\request\request.js:578:7)
    at runCallback (timers.js:756:18)
    at tryOnImmediate (timers.js:717:5)
    at processImmediate [as _immediateCallback] (timers.js:697:5)

5 个答案:

答案 0 :(得分:0)

尝试更改内容类型

function sendData() {
    var options = {
        method: 'POST',
        uri: `http://www.myurl.com/placeholder.json`,
        body: {
            "data":"desiredData // this should be a JSON format if you are using 
                                //application/json
        },
        headers: {
            "Accept": "application/json",
            "Accept-Encoding": "gzip, deflate",
            "Accept-Language": "en-US,en;q=0.9",
            "Connection": "keep-alive",
            "Content-Type": "application/json",
            "X-Requested-With": "XMLHttpRequest"
        }
    }
    rp(options)
        .then(function (parsedBody) {
            console.log(parsedBody)
        })
        .catch(function (err) {
            console.log(err)
        });
}

答案 1 :(得分:0)

在错误消息中,它说明了参数错误,因此请在sendData()函数中检查代码的正文部分。

尝试一下

function sendData() {
    var options = {
        method: 'POST',
        uri: 'http://www.myurl.com/placeholder.json',
        body: {
            data:'desiredData'
        },
        headers: {
            "Accept": "application/json",
            "Accept-Encoding": "gzip, deflate",
            "Accept-Language": "en-US,en;q=0.9",
            "Connection": "keep-alive",
            "Content-Type": "application/x-www-form-urlencoded",
            "X-Requested-With": "XMLHttpRequest"
        }
    }
    rp(options)
        .then(function (parsedBody) {
            console.log(parsedBody)
        })
        .catch(function (err) {
            console.log(err)
        });
}

我编辑您代码的第六行。

答案 2 :(得分:0)

我创建了此示例,以便了解request-promise的功能。

为数据设置option.body,并为json: true设置正文为JSON。

我使用一个简单的在线伪造REST API服务器,因此您可以运行示例而无需进行任何更改。

const rp = require('request-promise');
function sendData() {
  var options = {
    method: 'POST',
    uri: 'https://jsonplaceholder.typicode.com/posts',
    body: {
      title: 'foo',
      body: 'bar',
      userId: 1
    },
    headers: {
      "Content-type": "application/json; charset=UTF-8"
    },
    json: true // Automatically stringifies the body to JSON
  };

  rp(options)
    .then((parsedBody) => {
      console.log(parsedBody);
    })
    .catch((err) => {
      console.log(err);
    });
}
sendData();

答案 3 :(得分:0)

我设法解决了这个问题,首先我在标题下添加了json: true,然后导致了上面发布的另一个错误。为了解决这个问题,由于所有人的帮助,我还不得不将内容类型更改为application/json

答案 4 :(得分:0)

data:“ desiredData”应该是数据:desireData,其中desiredData是一个json对象。例如:

var desiredData = { propertyName: propertyValue }