通过导入的 const 指定标头时出现“收到无效的 lambda 响应”
我正在使用 CDK typescript lambda 堆栈,连接到 API 网关。 当我发送以下响应时,一切都运行正常:
const res = await request<ResponseModel>(req);
return {
statusCode: res.status,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': true
},
body: JSON.stringify(res.data)
};
但是,我尝试使用通用 const 设置标头,结果失败:
// common-headers.ts
export const CommonResponseHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': true
};
//function.ts
import { CommonResponseHeaders } from '../../common/common-headers';
const res = await request<ResponseModel>(req);
return {
statusCode: res.status,
headers: CommonResponseHeaders,
body: JSON.stringify(res.data)
};
//stack.ts
const function = {
name: 'myFunction',
runtime: Runtime.NODEJS_14_X,
entry: path.join(__dirname, './function.ts'),
vpcSubnets: {
subnetType: SubnetType.PRIVATE_WITH_EGRESS
},
handler: 'handler',
environment: {
...SomeDefaultVariables
}
}
const lambda = new NodejsFunction(this, function.name, function);
const functionUrl = lambda.addFunctionUrl({
authType: FunctionUrlAuthType.NONE,
cors: {
allowedOrigins: ['*'],
}
});
new CfnOutput(this, `${function.name}-FunctionUrl`, {
value: functionUrl.url,
});
Invalid lambda response received: Invalid API Gateway Response Keys: {'trace', 'errorType', 'errorMessage'} in {'errorType': 'TypeError', 'errorMessage': "Cannot read property 'trim' of undefined", 'trace': ["TypeError: Cannot read property 'trim' of undefined", ' at Object. (/var/task/index.js:10924:40)', ' at Module._compile (internal/modules/cjs/loader.js:1085:14)', ' at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)', ' at Module.load (internal/modules/cjs/loader.js:950:32)', ' at Function.Module._load (internal/modules/cjs/loader.js:790:12)', '
at Module.require (internal/modules/cjs/loader.js:974:19)', ' at require (internal/modules/cjs/helpers.js:101:18)', ' at _tryRequireFile (/var/runtime/UserFunction.js:72:32)', ' at _tryRequire (/var/runtime/UserFunction.js:160:20)', ' at _loadUserApp (/var/runtime/UserFunction.js:219:12)']}
非常感谢您的帮助!
您的代码返回的标头与 API Gateway 预期的标头不匹配。查看您的代码示例,如果您的响应成功,它将返回正确的标头。根据 AWS 文档 ,Lambda 函数必须返回以下格式的输出:
{
statusCode: "...", // a valid HTTP status code
headers: {
custom-header: "..." // any API-specific custom header
},
body: "...", // a JSON string.
isBase64Encoded: true|false // for binary support
}
因此,您的项目中的其他内容导致了此错误,并且此错误未得到正确处理。如果遇到错误,您应该以上述格式返回 4xx 或 5xx 状态代码。但是,由于您的示例非常小,我想这不会引发任何错误。这可能是由加载代码的 CDK 框架引起的。具体来说,我会关注以下事项:
-
有一个与 AWS amplify 相关的 问题 ,其中有人拼错了
approot
,而它应该是appRoot
。他在抱怨 trim 函数时遇到了完全相同的错误。 -
您必须配置 TypeScript 转译设置以匹配您计划使用的 Node.js 运行时。有关运行时的更多信息,请查看 AWS 的 此 文档。
-
使用 NodeJS 14.x 时,应仔细检查导入是否符合该特定版本的要求。从其他地方复制代码时很容易出错。我建议您仔细阅读此 帖子 ,它描述了在您的情况下应按如下方式导入本地文件(尽管这可能看起来很奇怪):
// 实际文件是 ../../common/common-headers.ts import { CommonResponseHeaders } from '../../common/common-headers.js';
It's causing issue because it couldn't able to detect your imports properly.
您是否正确导入了 common-headers.ts 文件,以便导入 CommonResponseHeaders?
您应该尝试在另一个名为
config.json
的文件中指定路径,您可以在其中执行如下操作:
只需确保在 include 中添加 common-headers.ts 文件路径即可。
{
"compilerOptions": {
...
},
"include": [
"./src/**/*",
"./common/**/*"
]
}
现在尝试使用 CDK 进行部署,这应该可以正确包含您的 common-headers.ts 并解决您的问题。
注意: 仍然不起作用?也许可以检查您的导入语句,看看您是否正确地从 common-headers.ts 文件导入了 CommonResponseHeaders