Поэтому я написал 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, но этот ответ предполагает, что такой подход хорош, я думаю. Кто-нибудь, пожалуйста?