Отправка файла в Slack с помощью https в node.js - PullRequest
0 голосов
/ 18 февраля 2020

Поэтому я написал Slack reporter для своих автоматических тестов и хотел переключиться с устаревшего модуля 'request' на 'https' module. Я изменил запрос на отправку обычного сообщения, но не знаю, как создать запрос на отправку файла. Я не могу найти ни одного примера в документации по узлу (там нет примеров POST для 'https'), а также ни одного примера такого использования на inte rnet. Может ли кто-нибудь помочь мне с этим?

Это рабочий запрос :

function sendLogFile() {
  console.log("Sending log file to slack...");
  return new Promise((resolve, reject) => {
    request.post(
      {
        url: fileUploadUrl,
        formData: {
          token: token,
          method: "POST",
          title: "Test Log File",
          filename: "testLog.txt",
          filetype: "auto",
          channels: "***",
          file: fs.createReadStream("testLog.txt")
        }
      },
      function(err, response) {
        if (response.body.includes("created"))
          resolve("File send successfully!");
        if (response.body.includes("error")) reject(response.body);
        if (err) reject(err);
      }
    );
  });
}

И это своего рода (СМОТРИТЕ РЕДАКТИРОВАТЬ НИЖЕ) то, что я хочу (но это не так) работает):

function sendLogFile() {
  return new Promise((resolve, reject) => {
    const requestOptions = {
      url: fileUploadUrl,
      headers: headers,
      formData: {
        token: token,
        method: "POST",
        title: "Test Log File",
        filename: "testLog.txt",
        filetype: "auto",
        channels: "***",
        file: fs.createReadStream("testLog.txt")
      }
    };

    const req = https.request(requestOptions, res => {
      res.on("data", d => resolve(d));
    });
    req.on("error", e => {
      reject(e);
    });

    // Probably that's the part where I'm stuck:
    req.write('????????')

    req.end();
  });
}

Я знаю, что для узла есть slackapi, но мне нужен этот репортер без каких-либо дополнительных пакетов. И я знаю, что это возможно с request.promise или xhr, но мне нужно, чтобы это было «https».

РЕДАКТИРОВАТЬ: Хорошо, поэтому я пытался добраться куда-то, и я думаю, что это должно выглядеть примерно так:

const file = fs.createReadStream("testLog.txt");

const options = {
  channels: "***",
  hostname: "slack.com",
  port: 443,
  path: '/api/files.upload',
  method: 'POST',
  headers: {
    'Authorization': "Bearer ***",
    'Content-Type': 'application/json; charset=utf-8',
  }
}

const req = https.request(options, res => {
  console.log(`statusCode: ${res.statusCode}`)

  res.on('data', d => {
    process.stdout.write(d)
  })
})

req.on('error', error => {
  console.error(error)
})

req.write(data)
req.end()

Но я понятия не имею, как вставить файл в req.write (data), поскольку «data» должен быть строкой, буфером, ArrayBuffer, Array или Array-подобным объектом. Итак, на данный момент я получаю ответ:

statusCode: 200 {"ok": false, "error": "no_file_data"}%

И я Я также не уверен, возможно ли это, потому что слабый API говорит, что заголовок должен быть formData, но этот ответ предполагает, что такой подход хорош, я думаю. Кто-нибудь, пожалуйста?

1 Ответ

0 голосов
/ 21 февраля 2020

Если вы обратитесь к https документации , вы увидите, что объект параметров не принимает такое свойство как formData.

Вместо этого вам следует попытаться отправить данные сообщения, как в этот ответ .

...