松弛文件上传中的no_file_data响应

时间:2019-01-25 15:46:56

标签: node.js axios query-string slack-api

我正在使用node.js尝试通过slackAPI的上载文件方法上载csv文件。该方法是发布。我不确定如何做到这一点,因为如果我使用content参数而不是文件,则会出现错误:

{ ok: false, error: 'invalid_array_arg' }

如果我使用文件参数,仍然会收到错误:

{ ok: false, error: 'invalid_array_arg' }

此代码中有多个故障点,我尝试对每个故障点进行测试,但是我确定这里缺少一些信息。这是我创建的uploadFile方法:

function uploadFile(file){
    console.log(botToken);
    axios.post('https://slack.com/api/files.upload', qs.stringify({token: botToken, file: file, channels: 'testing'}))
        .then(function (response) {
             var serverMessage = response.data;
             console.log(serverMessage);
             console.log("inside file upload function");
})
} 

这是我调用方法的方式:

var file = fs.createReadStream(__dirname + '/' + csvFilePath);   // <--make sure this path is correct
    console.log(__dirname + '/' + csvFilePath);
    uploadFile(file);

最后是输出:

启动了! C:\ Users \ i502153 \ WebstormProjects \ slackAPIProject / accessLogs / CSV / 1548430592860output.csv *     {ok:错误,错误:'invalid_array_arg'}     内部文件上传功能

我做错了什么以及如何纠正这个问题?

链接: https://api.slack.com/methods/files.upload https://www.npmjs.com/package/axios

1 个答案:

答案 0 :(得分:1)

您的解决方案将不起作用,因为您正试图获取一个流对象file)并将其字符串化为查询字符串,而这只会插入无意义的字符串“ [对象]”进入查询。它实际上不会将数据流传输到Slack。

不幸的是,Axios不能像在浏览器中那样在节点中正常工作,并且他们的文档可能有些混乱。

我建议采用这种方法(未经测试):

const axios = require('axios');
const FormData = require('form-data');

function uploadFile(file) {
    const form = new FormData();
    form.append('token', botToken);
    form.append('channels, 'testing');
    form.append('file', file, 'optionalfilenamehere');
    return axios.post('https://slack.com/api/files.upload', form, {
        headers: form.getHeaders()
    }).then(function (response) {
        var serverMessage = response.data;
        console.log(serverMessage);
        console.log('inside file upload function');
    });
}

我根据票证https://github.com/axios/axios/issues/1006#issuecomment-320165427中的建议改编了这段代码,如果遇到问题,这里可能还会有其他有用的评论。祝你好运!

编辑:对于以后阅读此书的人们,对于使用request而非axios的类似方法,请参见相关问题Slack API (files.upload) using NodeJS