1
私はgm
を使用して、nodeJSアプリケーション内のいくつかの画像を操作しています。これは私の機能がどのように見えるかです。NodeJS/gm:非同期呼び出しで約束する
ご覧のとおり、いくつかの操作(この例では回転)用のスイッチがあります。 gmStream
が作成され、スイッチ.stream()
とpipe()
が使用されます。 これまでのところすべて問題ありません。
スイッチケースresize
の場合は、画像の寸法を知る必要があります。これはsize()
で取得します。しかし、これは非同期呼び出しです。 このgmStream
はスイッチの下に表示されているstream()
には使用されません。しかし、あなたは後にしているものを達成するために一緒にチェーンを約束したいことがあります...
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)
})
})
})
}