【发布时间】:2017-09-09 22:55:17
【问题描述】:
我正在使用gm 来处理我的nodeJS 应用程序中的一些图像。这就是我的函数的样子。
如您所见,有一个用于某些操作的开关(在此示例中:旋转)。 gmStream 被创建并且在开关 .stream() 和 pipe() 之后将被使用。
到目前为止一切都很好。
但对于开关盒resize,我需要知道图像的尺寸,我确实通过size() 获得。但这是一个异步调用。
有了这个gmStream 不用于开关下方显示的stream()。但是这个stream()会做更多的DB东西,所以我需要使用同样的东西......
function manipulate (method, param) {
return new Promise(function (resolve, reject) {
// Configure GridFS (gridfs-stream)
const gfs = Grid(
MongoInternals.defaultRemoteCollectionDriver().mongo.db,
MongoInternals.NpmModule
)
switch (method) {
case 'rotate':
gmStream = gm(readStream)
.rotate('#ffffff', param.rotate)
break
// ... some more cases ...
case 'resize':
gmStream = gm(readStream)
.size(function (err, size) {
if (!err && size.width >= 1000 && size.height >= 1000) {
gmStream.resize('1000').stream().pipe(writeStream) // <-- should use the stream call below, as there has to be done some DB manipulation...
}
})
break
}
// resize case should also use this part...
gmStream
.stream(function (err, stdout, stderr) {
gfs.findOne({ _id: sourceId }, function (err, file) {
const writeStream = gfs.createWriteStream({
metadata: { }
})
writeStream.on('close',
function (newFile) {
resolve(newFile)
}
)
stdout.pipe(writeStream)
})
})
})
}
【问题讨论】:
标签: javascript node.js asynchronous promise gm