我正在尝试执行shell命令以从AWS lambda迁移。这个想法是,每当需要运行迁移时,我们都会通过AWS CLI调用lambda。我无法使其运行。运行迁移的命令永远不会执行,并且总是带有null的响应。任何帮助将不胜感激。
这是我的代码:
const exec = require("child_process").exec;
const { okResponse, errorResponse } = require('./response');
exports.handler = async (event) => {
exec("node ./node_modules/db-migrate/bin/db-migrate up --config=./database.json", (error, stdout, stderr) => {
if (error) {
console.error(`error: ${error.message}`);
return errorResponse(500, 'Error running migration.');
}
if (stderr) {
console.log(`stderr: ${stderr}`);
return errorResponse(500, 'Error running migration.');
}
console.log(`stdout: ${stdout}`);
return okResponse(200, 'Migration successfully.');
});
}
答案 0 :(得分:2)
我的猜测是,因为您正在使用async lambda handler,所以函数在exec
甚至没有运行之前就已完成。因此,您可以使用promise
(如链接文档中所示)来解决此问题。
一个例子是:
const exec = require("child_process").exec;
const { okResponse, errorResponse } = require('./response');
exports.handler = async (event) => {
const promise = new Promise(function(resolve, reject) {
exec("node ./node_modules/db-migrate/bin/db-migrate up --config=./database.json", (error, stdout, stderr) => {
if (error) {
console.error(`error: ${error.message}`);
return errorResponse(500, 'Error running migration.');
}
if (stderr) {
console.log(`stderr: ${stderr}`);
return errorResponse(500, 'Error running migration.');
}
console.log(`stdout: ${stdout}`);
return okResponse(200, 'Migration successfully.');
})
})
return promise
}
请注意,我尚未运行代码,可能需要进行进一步更改才能使其正常工作。