开发者问题收集

通过导入的 const 指定标头时出现“收到无效的 lambda 响应”

2023-01-19
839

我正在使用 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)']}

非常感谢您的帮助!

2个回答

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

  1. 有一个与 AWS amplify 相关的 问题 ,其中有人拼错了 approot ,而它应该是 appRoot 。他在抱怨 trim 函数时遇到了完全相同的错误。

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

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

    // 实际文件是 ../../common/common-headers.ts
    import { CommonResponseHeaders } from '../../common/common-headers.js';
    
Cloudkollektiv
2023-01-28

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

Myth
2023-01-29