fs.createWriteStream при событии ошибки не перехватывает ошибки - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь безопасно загрузить изображения с URL на сервер.

var http = require('http');
var fs = require('fs');
var path = require('path')

var download = function(url, dest, filename, cb) {
    var file = fs.createWriteStream(dest + "/" + filename + path.extname(url));

    var request = http.get(url, function(response) {
        response.pipe(file);
        file.on('error', function(err) {
            console.log(err.message);
            file.end();
        });
        file.on('finish', function() {
            file.close(cb);
        });
    }).on('error', function(err) { // Handle errors
        fs.unlink(dest);
        if (cb) cb(err.message);
    });
}

var url = "https://vignette.wikia.nocookie.net/spongebob/images/d/d7/SpongeBob_stock_art.png";

download(url, 'downloadedAssets/imgs', 'spongebob', function onComplete(err) {
    if (err) {
        console.log(err.message);
    } else {
        console.log('image uploaded to server');
    }
});

Который сбивает сервер

TypeError [ERR_INVALID_PROTOCOL]: протокол «https:» не поддерживается. Ожидаемое "http:"

Я понимаю, что не могу загрузить https файлы, но почему происходит сбой сервера вместо того, чтобы выполнить file.on ('error'), а затем завершить файл.

Я также пытался попробовать / поймать и то же самое

Ответы [ 2 ]

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

Сбой при http.get(url,function(){..}), потому что вы используете http модуль. Вам нужно использовать модуль https, чтобы выполнить запрос get на https url.

const https = require('https');

https.get('https://encrypted.google.com/', (res) => {
  console.log('statusCode:', res.statusCode);
  console.log('headers:', res.headers);

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

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

Вы можете использовать модуль request, который поддерживает http и https. Из документа :

Запрос предназначен для простейшего способа сделать http звонки. Он поддерживает HTTPS и выполняет перенаправления по умолчанию .const request = require ('request');

const options = {
  url: 'https://api.github.com/repos/request/request',
  headers: {
    'User-Agent': 'request'
  }
};

function callback(error, response, body) {
  if (!error && response.statusCode == 200) {
    const info = JSON.parse(body);
    console.log(info.stargazers_count + " Stars");
    console.log(info.forks_count + " Forks");
  }
}

request(options, callback);

Или чтобы использовать Promises из коробки, используйте axios.

1 голос
/ 03 июля 2019

fs.createWriteStream работает абсолютно нормально, поэтому он не выдает исключений или ошибок.

Ошибка исходит из метода http.get (), потому что вы пытаетесь получить доступ к «https» с помощью модуля http. Поместите отладчик в модуль http.get (), вы обязательно получите ошибку.

...