typescript - 'Ogiltigt lambda-svar mottaget' när man specificerar headers via en importerad const
Jag använder CDK TypeScript Lambda-stack, kopplad till en API Gateway. Allt fungerar precis som det ska när jag skickar följande svar:
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)
};
Men jag har försökt att ställa in rubrikerna med en vanlig konstant, och resultatet är ett misslyckande:
// 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,
});
Ogiltigt lambda-svar mottaget: Ogiltiga API Gateway-svarnycklar: {'trace', 'errorType', 'errorMessage'} i {'errorType': 'TypeError', 'errorMessage': "Kan inte läsa egenskapen 'trim' av undefined", 'trace': ["TypeError: Kan inte läsa egenskapen 'trim' av undefined", ' vid Object. (/var/task/index.js:10924:40)', ' vid Module._compile (internal/modules/cjs/loader.js:1085:14)', ' vid Object.Module._extensions..js (internal/modules/cjs/loader.' js:1114:10)', ' vid Module.load (internal/modules/cjs/loader.js:950:32)', ' vid Function.Module._load (internal/modules/cjs/loader.js:790:12)', '
vid Module.require (internal/modules/cjs/loader.js:974:19)', ' vid require (internal/modules/cjs/helpers.js:101:18)', ' vid _tryRequireFile (/var/runtime/UserFunction.js:72:32)', ' vid _tryRequire (/var/runtime/UserFunction.js:160:20)', ' vid _loadUserApp (/var/runtime/UserFunction.js:219:12)']
Hjälp skulle uppskattas mycket!
Svar #1
Det finns en mismatch mellan de headers som din kod returnerar och vad API Gateway förväntar sig. Om man tittar på ditt kodexempel, om ditt svar lyckas, returnerar det de korrekta headers. Enligt AWS-dokumentationen måste Lambda-funktionen returnera output i följande format:
{
statusCode: "...", // a valid HTTP status code
headers: {
custom-header: "..." // any API-specific custom header
},
body: "...", // a JSON string.
isBase64Encoded: true|false // for binary support
}
Så något annat i ditt projekt orsakar detta fel, och detta fel hanteras inte på rätt sätt. Om du stöter på ett fel bör du returnera en 4xx- eller 5xx-statuskod i det format som beskrivs ovan. Eftersom ditt exempel dock är ganska litet, antar jag att detta inte kommer att utlösa några fel. Det orsakas troligen av CDK-ramverket som din kod körs i. Specifikt skulle jag titta på följande saker:
Det finns ett relaterat problem om AWS Amplify, där någon stavade
approotfel, när det egentligen skulle ha varitappRoot. Han fick exakt samma fel som klagade på trim-funktionen.Du måste konfigurera dina TypeScript-transpilationsinställningar för att matcha den Node.js-runtime du planerar att använda. Kolla in denna dokumentation från AWS för mer information om runtimes.
När du använder NodeJS 14.x bör du dubbelkolla om dina importeringar matchar kraven för just den versionen. Ett misstag är lätt att göra när man kopierar kod från någon annanstans. Jag föreslår att du noggrant läser det här inlägget, det beskriver att lokala filer i ditt fall bör importeras på följande sätt (även om det kan verka konstigt):
// Actual file is ../../common/common-headers.ts import { CommonResponseHeaders } from '../../common/common-headers.js';
Svar #2
Det orsakar problem eftersom det inte kunde upptäcka dina imports korrekt.
Har du korrekt importerat common-headers.ts-filen så att dina CommonResponseHeaders fungerar?
Du bör försöka specificera sökvägar i en annan fil som heter config.json där du skulle kunna göra något liknande detta:
Se bara till att du lägger till sökvägen till filen common-headers.ts i include.
{
"compilerOptions": {
...
},
"include": [
"./src/**/*",
"./common/**/*"
]
}
Försök nu att distribuera med CDK, detta bör inkludera din common-headers.ts på rätt sätt och kommer att lösa ditt problem.
Obs: Fungerar det fortfarande inte? Kanske bör du kontrollera din import-sats och se om du korrekt importerar CommonResponseHeaders från filen common-headers.ts eller inte
