noa*_*myg 5 typescript aws-lambda aws-api-gateway aws-cdk
我正在使用 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)
};
Run Code Online (Sandbox Code Playgroud)
但是,我尝试使用通用常量设置标头,结果失败:
// 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,
});
Run Code Online (Sandbox Code Playgroud)
收到无效的 lambda 响应:无效的 API 网关响应键:{'errorType': 'TypeError', 'errorMessage'} 中的 {'trace', 'errorType', 'errorMessage'}: "无法读取未定义的属性 'trim'", ' trace': ["TypeError: 无法读取未定义的属性 'trim'", ' at Object. (/var/task/index.js:10924:40)', ' 在 Module._compile (内部/modules/cjs/loader.js:1085:14)', ' 在 Object.Module._extensions..js (内部/modules/cjs/loader.js:1114:10)', ' 在 Module.load (internal/modules/cjs/loader.js:950:32)', ' 在 Function.Module._load (internal/modules/cjs /loader.js:790:12)', '
在 Module.require (internal/modules/cjs/loader.js:974:19)', ' 在 require (internal/modules/cjs/helpers.js:101:18) )', ' 在 _tryRequireFile (/var/runtime/UserFunction.js:72:32)', ' 在 _tryRequire (/var/runtime/UserFunction.js:160:20)', ' 在 _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
}
Run Code Online (Sandbox Code Playgroud)
因此,您的项目中的其他内容导致了此错误,并且此错误未得到正确处理。如果遇到错误,您应该以上述格式返回 4xx 或 5xx 状态代码。但是,由于您的示例非常小,我想这不会引发任何错误。这可能是由加载代码的 CDK 框架引起的。具体来说,我会看以下几件事:
有一个关于 AWS amplify 的相关问题,有人拼写错误approot
,而它应该在哪里appRoot
。他在抱怨修剪功能时遇到了完全相同的错误。
您必须配置 TypeScript 转译设置以匹配您计划使用的 Node.js 运行时。查看AWS 的此文档,了解有关运行时的更多信息。
使用 NodeJS 14.x 时,您应该仔细检查您的导入是否符合该特定版本的要求。从其他地方复制代码时很容易犯错误。我建议您仔细阅读这篇文章,它描述了在您的情况下应该按如下方式导入本地文件(尽管这可能看起来很奇怪):
// Actual file is ../../common/common-headers.ts
import { CommonResponseHeaders } from '../../common/common-headers.js';
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
705 次 |
最近记录: |