使用请求和gm模块在NodeJS中下载后立即调整图像大小

我正在尝试调整图像的大小后,我已经下载它们使用nodejs,请求和gm模块,但我很难正确地pipe理的东西了。

var fs = require('fs'); var path = require('path'); var gm = require('gm').subClass({imageMagick: true}); var request = require('request'); var async = require('async'); var folderImages = './images/'; var q = async.queue(function (task, callback) { // Renaming the images var thumb350 = task.target.replace('.jpg', '-350.jpg'); // The target path/images var target350 = path.join(folderImages, thumb350); // Download the images request .get(task.PhotoURL) .on('response', function(response) { console.log(task.PhotoURL + ' : ' + response.statusCode, response.headers['content-type']); callback(); }) .on('error', function(err) { console.log(err); callback(err); }) .pipe(fs.createWriteStream(task.target)); // How can I run this function on files that get downloaded? var resizePhotos = gm(task.target) .resize('350') .write(target350, function (err) { if (!err){ console.log(task.target, ': 350 done'); } else { console.log(task.target, ': error'); } }); }, 50); 

您可以在writeStream上监听finish事件,然后在调用中放置resize的逻辑:

 ... .pipe(fs.createWriteStream(task.target)) .on('finish', function(){ //called when writing to disk is complete var resizePhotos = gm(task.target) .resize('350') .write(target350, function (err) { if (!err){ console.log(task.target, ': 350 done'); } else { console.log(task.target, ': error'); } }); }) 

实际上, request.get返回一个stream,你可以通过gm(request.get(url)).resize(350)而不是写入文件系统并重新加载。