2013-12-12 81 views
1

我試圖使用imagemagick來調整我的圖像大小,然後將它傳遞給圖像壓縮工具進行壓縮。我想利用pngquant`Node.js:使用ImageMagick時的異步問題

這裏是我的代碼片段:

// Rename and move original file 
if (fs.existsSync(tmpPath + '/' + file)) { 
    fs.renameSync(tmpPath + '/' + file, filePath + '/' + fileName); 

    // Create new versions of each file 
    Object.keys(geddy.config.uploader.imageVersions).forEach(function (version) { 
     console.log(version); 
     counter += 1; 
     var opts = geddy.config.uploader.imageVersions[version]; 
     console.log(fileName); 
     imageMagick.resize({ 
      width: opts.width, 
      srcPath: filePath + '/' + fileName, 
      dstPath: filePath + '/' + fileName.replace(/\.[^/.]+$/, "") + '_' + version + fileType 
     }, finish(filePath + '/' + fileName.replace(/\.[^/.]+$/, "") + '_' + version + fileType)); 
    }); 
} else { 
    console.log('Unable to find tmp file!'); 
} 

那麼這裏就是我的回調finish

finish = function (file) { 
    execFile(pngquantPath, ['256', '--force', file], function(err, data) { 
     console.log(err, data); 
    }); 
}; 

但是,每次pngquant時間跟它有沒有找到文件。如果我使用參數file並進入shell,請運行pngquant file,它將運行該進程。所以我假設它是一個異步問題(文件不存在,它試圖運行該進程)。

這是我結束了在控制檯中的錯誤: { [Error: spawn EACCES] code: 'EACCES', errno: 'EACCES', syscall: 'spawn' } ''

任何幫助表示讚賞。

+0

檢查文件/文件夾權限 – vinayr

+0

如果我嘗試運行'fs.chmodSync(file,'777');'finish'回調內容而不是'錯誤:ENOENT,沒有這樣的文件或目錄'上面列出的代碼 – Neil

回答

0

imageMagick.resize()需要兩個參數:一個選項對象和一個回調。

對於第二個參數,您沒有通過finish作爲回調。相反,你是調用finish並傳遞任何finish返回(可能undefined)作爲callback參數。

由於您在調用finish的同時調用了resize(),因此它在ImageMagick完成其調整大小操作之前立即運行。

嘗試改變resize()行是這樣的:

imageMagick.resize({ 
    // (your resize options) 
}, 
function(err) { 
    if (err) { return console.error(err); } // whatever error handling you need 
    var thePath = filePath + '/' + fileName.replace(/\.[^/.]+$/, "") + '_' + 
    version + fileType; 
    finish(thePath); 
}); 

現在你傳遞一個回調函數作爲第二個參數,而且功能也不會被調用,直到imageMagick.resize()完成。當然,它具有所有Node回調的簽名,這是回調的第一個參數是err。當它被調用時,回調會進行一些錯誤檢查,然後調用finish

+0

嗯,當處理圖像後嘗試運行'pngquant'時,仍然得到'{[Error:spawn EACCES]代碼:'EACCES',errno:'EACCES',syscall:'spawn'}'''運行'fs.chmodSync(文件,'777');''在'pngquant'命令沒有修復它之前... chmodSync找到了這個文件(使用我以前的代碼崩潰的應用程序)。 – Neil

+0

有趣。我不確定'EACCES'是否意味着找不到PNG文件。這可能意味着它出於某種原因無法產生'pngquant'可執行文件。你確定'pngquantPath'是否正確,是否是絕對路徑? – Nate