TypeError:第一个参数必须是字符串或缓冲区。使用Javascript

时间:2017-09-09 19:52:41

标签: javascript http npm request

var formData = {
  name: 'TestDeck',
  description: 'This is a test deck for my api',
  private: false,
  shareable: false,
  ttsLanguages: [],
  blacklistedSideIndices: [],
  blacklistedQuestionTypes: [],
  gradingModes: [],
  imageAttribution: 'https://www.logogarden.com/wp-content/uploads/lg-index/Example-Logo-6.jpg',
  imageFile: fs.readFile('retext.png', 'utf8')
}

function createDeck(connection) {
  request.post({
      url: '<url>',
      formData: formData,
      headers: {
        'Content-Type': 'multipart/form-data'
      },
      json: true
    }),
    function(err, resp, body) {

    }
}

我收到错误:TypeError:第一个参数必须是字符串或缓冲区。

老实说,我不知道为什么,需要帮助。

1 个答案:

答案 0 :(得分:4)

代码中存在几个问题。

  1. 您得到TypeError: First argument must be a string or Buffer因为您尝试在表单数据中发送布尔值false - HTML表单不支持布尔值。在HTML中,选中复选框将发送其值,而未选中复选框则不会。

    要解决此问题,您可以将false更改为'FALSE'(字符串)并在服务器端解析它。

  2. fs.readFile('retext.png', 'utf8')的使用不正确。要在表单中附加文件,正确的方法是:imageFile: fs.createReadStream('retext.png')

  3. formData: formData中使用request.post(...)时,HTTP请求的Content-Type会自动multipart/form-data,您不需要定义{再次{1}}标题。

    此外,设置Content-Type是不正确的,这会使json: true成为Content-Type。这种冲突会使application/json模块混淆,并可能在某些JavaScript环境中引起问题。

  4. 回调函数request应该是function(err, resp, body){...}的一部分,可能是拼写错误。

  5. 总之,正确的代码如下:

    request.post(...)