Загрузка изображения в Twitter через Node.js приводит к ошибке HTTP 400 (неверный запрос) - PullRequest
1 голос
/ 01 июля 2019

Я пытаюсь загрузить изображение в Twitter, отправив его на определенный канал Discord.Вот код, который я использую:

var number = 0;

function downloadJPG(url) { //This function downloads the image in jpg format
    request.get(url).on('error', console.error).pipe(fs.createWriteStream('image.jpg'));
}

if (message.attachments.every(attachIsImageJPG)) {
      downloadJPG(message.attachments.first().url);
      var imageToPostJPG = fs.readFileSync('image.jpg');
      client.post('media/upload', {media: imageToPostJPG}, function(err, data, res) {
    if (err) console.log(err);
    console.log(data);
    number = number+1
    client.post('statuses/update', {status: 'Success Cop #'+number, media_ids: data.media_id_string}, function(err, params, res) {
        if (err) console.log(err);
        console.log(params);
        });
    });
}

Изображение должно быть загружено в Twitter со статусом, но загружается только статус, и это то, что я вижу в консоли:

Error: HTTP Error: 400 Bad Request
    at Request._callback (C:\Users\Silvano\Desktop\Twitter\node_modules\twitter\lib\twitter.js:221:9)
    at Request.self.callback (C:\Users\Silvano\Desktop\Twitter\node_modules\request\request.js:185:22)
    at Request.emit (events.js:200:13)
    at Request.<anonymous> (C:\Users\Silvano\Desktop\Twitter\node_modules\request\request.js:1161:10)
    at Request.emit (events.js:200:13)
    at IncomingMessage.<anonymous> (C:\Users\Silvano\Desktop\Twitter\node_modules\request\request.js:1083:12)
    at Object.onceWrapper (events.js:288:20)
    at IncomingMessage.emit (events.js:205:15)
    at endReadableNT (_stream_readable.js:1154:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:9)
{
  request: '/1.1/media/upload.json',
  error: 'media type unrecognized.'
}

Как я могу устранить эту ошибку и загрузить изображение тоже?

1 Ответ

2 голосов
/ 02 июля 2019

Мне кажется, проблема в том, что поток должен быть завершен до того, как readFileSync его прочитает.

// modified to indicate completion by calling callback
function downloadJPG(url, callback) { //This function downloads the image in jpg format
  let stream = request.get(url).on('error', console.error).pipe(fs.createWriteStream('image.jpg'));
  stream.on('finish', callback);
}

// modified to do the twtr work in the callback
if (message.attachments.every(attachIsImageJPG)) {
    downloadJPG(message.attachments.first().url, function() {
        var imageToPostJPG = fs.readFileSync('image.jpg');
        client.post('media/upload', {media: imageToPostJPG}, function(err, data, res) {
        if (err) console.log(err);
        console.log(data);
        number = number+1
        client.post('statuses/update', {status: 'Success Cop #'+number, media_ids: data.media_id_string}, function(err, params, res) {
            if (err) console.log(err);
            console.log(params);
            });
        });
    });
}

Примечание: я обнаружил, что после одного или двух шагов стиль обратного вызова слишком сложен для записии читать, и это обещания предпочтительнее.

...