Ответ no_file_data при загрузке слабого файла - PullRequest
0 голосов
/ 25 января 2019

Я использую node.js, чтобы попытаться загрузить CSV-файл с помощью метода загрузки файла slackAPI.Метод пост.Я не уверен, как сделать это возможным, потому что если я использую аргумент содержимого вместо файла, я получаю сообщение об ошибке:

{ 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);

И, наконец, вывод:

Bot запущен!C: \ Users \ i502153 \ WebstormProjects \ slackAPIProject / accessLogs / CSV / 1548430592860output.csv * {ok: false, error: 'invalid_array_arg'} внутри функции загрузки файлов

Что я делаю не так и как это исправить?

Ссылки: https://api.slack.com/methods/files.upload https://www.npmjs.com/package/axios

1 Ответ

0 голосов
/ 25 января 2019

Ваше решение не будет работать, потому что вы пытаетесь взять потоковый объект (file) и преобразовать его в строку запроса, которая просто вставит бессмысленную строку "[объект]"в запрос.На самом деле он не будет передавать данные в Slack.

Axios, к сожалению, не работает в узле так же, как в браузере, и их документы могут немного сбивать с толку.

Iпредложил бы такой подход (не проверено):

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) с использованием NodeJS .

...