管道调整大小的图像以表达响应设置响应 header 到 'Content-Length:0' 并且没有数据响应
Piping resized image to express response setting response header to 'Content-Length:0' and no data in response
我正在构建一个虚拟图像生成器来提高我对 Node 和 Express 的理解。我从 URL 获取尺寸并使用 GM 包来调整它的大小。结果流通过管道传输到响应中。但是我没有在前端获取数据,当我在 Chrome 的开发工具的网络面板中检查响应选项卡时,我看到 'this response has no data available'。有人可以给我一些指示,因为我不确定我可以从哪里开始调试它。
const IMAGE_DIR_PATH = path.join(__dirname, './../../data/images');
const getRandomImageName = () => {
return new Promise((resolve, reject) => {
fs.readdir(IMAGE_DIR_PATH, (err, images) => {
err ? reject(err) : resolve(
images[Math.floor(Math.random() * images.length)]
);
});
});
};
const pickDimensions = (dimensionsStr) => {
const dimensions = dimensionsStr.toLowerCase().split('x');
return {
width: dimensions[0],
height: dimensions[1] ? dimensions[1] : dimensions[0]
};
};
exports.getRandomImageByDimension = (req, res, next) => {
const dimensions = pickDimensions(req.params.dimensions);
//getRandomImageName returns a Promise
//resolves with the name of the file example: abc.jpg
getRandomImageName()
.then((img) => {
res.set('Content-Type', 'image/jpeg');
//I am getting the right image and the path below is valid
gm(path.resolve(`${IMAGE_DIR_PATH}/${img}`))
.resize(dimensions.width, dimensions.height)
.stream(function (err, stdout, stderr) {
if (err) { throw new Error(err); }
stdout.pipe(res);
});
})
.catch(e => {
res.status(500);
res.send(e);
});
};
我收到的回复headers如下所示:
结果是我忘记添加 ImageMagick as a dependency for gm,这导致了错误。奇怪的是,错误没有显示在控制台中,我只是在将应用程序分解成更简单的部分并按照上面评论中提到的 skirtle 进行调试后才发现它。
为了修复,我做了以下操作:
npm install --save imagemagick
然后在我使用 gm 包的文件中,我设置了 imageMagick 属性:
const gm = require('gm').subClass({imageMagick: true});
注意:我是 运行 这个 Windows 7.
我正在构建一个虚拟图像生成器来提高我对 Node 和 Express 的理解。我从 URL 获取尺寸并使用 GM 包来调整它的大小。结果流通过管道传输到响应中。但是我没有在前端获取数据,当我在 Chrome 的开发工具的网络面板中检查响应选项卡时,我看到 'this response has no data available'。有人可以给我一些指示,因为我不确定我可以从哪里开始调试它。
const IMAGE_DIR_PATH = path.join(__dirname, './../../data/images');
const getRandomImageName = () => {
return new Promise((resolve, reject) => {
fs.readdir(IMAGE_DIR_PATH, (err, images) => {
err ? reject(err) : resolve(
images[Math.floor(Math.random() * images.length)]
);
});
});
};
const pickDimensions = (dimensionsStr) => {
const dimensions = dimensionsStr.toLowerCase().split('x');
return {
width: dimensions[0],
height: dimensions[1] ? dimensions[1] : dimensions[0]
};
};
exports.getRandomImageByDimension = (req, res, next) => {
const dimensions = pickDimensions(req.params.dimensions);
//getRandomImageName returns a Promise
//resolves with the name of the file example: abc.jpg
getRandomImageName()
.then((img) => {
res.set('Content-Type', 'image/jpeg');
//I am getting the right image and the path below is valid
gm(path.resolve(`${IMAGE_DIR_PATH}/${img}`))
.resize(dimensions.width, dimensions.height)
.stream(function (err, stdout, stderr) {
if (err) { throw new Error(err); }
stdout.pipe(res);
});
})
.catch(e => {
res.status(500);
res.send(e);
});
};
我收到的回复headers如下所示:
结果是我忘记添加 ImageMagick as a dependency for gm,这导致了错误。奇怪的是,错误没有显示在控制台中,我只是在将应用程序分解成更简单的部分并按照上面评论中提到的 skirtle 进行调试后才发现它。
为了修复,我做了以下操作:
npm install --save imagemagick
然后在我使用 gm 包的文件中,我设置了 imageMagick 属性:
const gm = require('gm').subClass({imageMagick: true});
注意:我是 运行 这个 Windows 7.