通过导入的常量指定标头时“收到无效的 lambda 响应”

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)']}

非常感谢您的帮助!

Neb*_*tic 0

您的代码返回的标头与 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 框架引起的。具体来说,我会看以下几件事:

  1. 有一个关于 AWS amplify 的相关问题,有人拼写错误approot,而它应该在哪里appRoot。他在抱怨修剪功能时遇到了完全相同的错误。

  2. 您必须配置 TypeScript 转译设置以匹配您计划使用的 Node.js 运行时。查看AWS 的文档,了解有关运行时的更多信息。

  3. 使用 NodeJS 14.x 时,您应该仔细检查您的导入是否符合该特定版本的要求。从其他地方复制代码时很容易犯错误。我建议您仔细阅读这篇文章,它描述了在您的情况下应该按如下方式导入本地文件(尽管这可能看起来很奇怪):

     // Actual file is ../../common/common-headers.ts
     import { CommonResponseHeaders } from '../../common/common-headers.js';
    
    Run Code Online (Sandbox Code Playgroud)