fs.createWriteStream on error 事件不捕获错误
fs.createWriteStream on error event does not catch errors
我正在尝试将图像从 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]: Protocol "https:" not supported.
Expected "http:"
我知道我无法上传 https 文件,但为什么它会导致服务器崩溃而不是执行 file.on('error') 然后结束文件。
我也试过 try/catch 和同样的事情
它在 http.get(url,function(){..})
处崩溃,因为您正在使用 http
模块。您需要使用 https
模块对 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
。来自 doc:
Request is designed to be the simplest way possible to make http
calls. It supports HTTPS and follows redirects by default.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
。
fs.createWriteStream 工作绝对正常,因此不会抛出异常或错误。
错误来自 http.get() 方法,因为您正在尝试使用 http 模块访问 'https'。将调试器放在 http.get() 模块中,你肯定会抛出错误。
我正在尝试将图像从 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]: Protocol "https:" not supported. Expected "http:"
我知道我无法上传 https 文件,但为什么它会导致服务器崩溃而不是执行 file.on('error') 然后结束文件。
我也试过 try/catch 和同样的事情
它在 http.get(url,function(){..})
处崩溃,因为您正在使用 http
模块。您需要使用 https
模块对 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
。来自 doc:
Request is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default.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
。
fs.createWriteStream 工作绝对正常,因此不会抛出异常或错误。
错误来自 http.get() 方法,因为您正在尝试使用 http 模块访问 'https'。将调试器放在 http.get() 模块中,你肯定会抛出错误。