错误事件上的fs.createWriteStream无法捕获错误

时间:2019-07-03 18:43:21

标签: javascript node.js http fs

我正在尝试将图片从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')然后结束文件。

我也尝试过 try / catch 和同样的事情

2 个答案:

答案 0 :(得分:2)

由于您正在使用http.get(url,function(){..})模块,它在http崩溃。您需要使用https模块对https网址进行get请求。

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

您可以使用同时支持requesthttp的{​​{1}}模块。从doc

  

请求被设计为制作http的最简单方法   电话。它支持HTTPS并默认遵循重定向。const request = require('request');

https

或者要立即使用“承诺”,请使用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);

答案 1 :(得分:1)

fs.createWriteStream绝对正常工作,因此不会引发异常或错误。

该错误来自http.get()方法,因为您尝试使用http模块访问'https'。将调试器放在http.get()模块中,肯定会引发错误。