我在Node应用程序的bin目录中编译了GraphicsMagick。当我生成一个子进程直接运行gm时,我能够获得标准输出,并且看不到任何错误。
然后我绑在gm模块中。我的应用程序找到gm,因为如果我将路径更改为gm,则会收到一条错误消息,指出它找不到gm。但是,当我运行下面粘贴的代码时,没有完成大小调整,也没有记录错误消息。如果我将图像路径更改为不存在的路径,则仍然不会出错。
const BIN_PATH = `${process.env.LAMBDA_TASK_ROOT}/graphicsmagick/bin/`;
const gm = require('gm');
...
const file = './spec/large.png';
gm(file)
.resize(240, 240)
// .autoOrient()
// .noProfile()
.write('./resize.png', (err) => {
if (err) {
logger.error(err);
const err2 = createError(err, event, `Failed to resize image ${file}`);
throw err2;
}
logger.info(`done resizing ${file}`);
});
答案 0 :(得分:1)
我将包含gm
的./graphicsmagick/bin目录添加到PATH变量,并且还设置了LD_LIBRARY_PATH环境变量。我在Amazon AMI EC2中编译了GraphicsMagick,并将其添加到./graphicsmagick目录中的仓库中。
在EC2中还安装了几个共享库,我必须将它们复制到./graphicsmagick/lib目录中(lib已经有一些文件,但不是所有必需的库)。我不记得哪个目录包含共享库,但是它可能是/ usr / lib或/ usr / local / lib。如果您在AWS上或使用SAM工具在本地运行Lambda,它将告诉您缺少哪个文件,只需在EC2上执行`find / -name filename.so'就会在文件所在的目录中生成。我必须将42个文件复制到lib。
我还应注意,以后我添加了一个检查以确保退出状态为0。我认为这是丢失的信息,以便能够知道发生了错误。
//全局在处理程序之外
const BIN_PATH = `${process.env.LAMBDA_TASK_ROOT}/graphicsmagick/bin/`;
process.env.PATH = `${process.env.PATH}:${BIN_PATH}`;
...
//In the handler
const cmd = 'gm';
const params = ['convert', sourceFile, '-resize', size, outputFilePath];
logger.debug({ command: { cmd, params } });
const childProcess = spawn(cmd, params, {
env: {
...process.env,
PATH: `./graphicsmagick/bin/:${process.env.PATH}`,
LD_LIBRARY_PATH: './graphicsmagick/lib',
},
});
childProcess.stdout.on('data', (chunk) => {
stdOut = `${stdOut}${chunk}`;
});
childProcess.stderr.on('data', (chunk) => {
errorOut = `${errorOut}${chunk}`;
});
exitCode = await childProcessPromise({ logger }, event, childProcess);
} else {
await copyFile(sourceFile, outputFilePath);
}