Skip to content

Commit f7d5c00

Browse files
committed
fix: fix error when request has no body pass
Signed-off-by: seven <[email protected]>
1 parent 7125a7a commit f7d5c00

File tree

7 files changed

+142
-100
lines changed

7 files changed

+142
-100
lines changed

package-lock.json

Lines changed: 34 additions & 30 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@geek-fun/serverless-adapter",
3-
"version": "0.0.1",
3+
"version": "0.0.2",
44
"description": "Adapter for web frame work express, koa, springboot to run in serverless function as backend of apigateway cross multi cloud provider like aliyun, huawei",
55
"homepage": "https://www.geekfun.club/",
66
"main": "dist/src/index.js",

src/context.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,22 @@ import url from 'node:url';
44
import ServerlessResponse from './serverlessResponse';
55
import { debug } from './common';
66

7-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
7+
// const requestRemoteAddress = (event) => {
8+
// if (event.version === '2.0') {
9+
// return event.requestContext.http.sourceIp;
10+
// }
11+
// return event.requestContext.identity.sourceIp;
12+
// };
13+
814
export const constructFrameworkContext = (event: Event, context: Context) => {
915
debug(`constructFrameworkContext: ${JSON.stringify({ event, context })}`);
1016
const request = new ServerlessRequest({
1117
method: event.httpMethod,
1218
headers: event.headers,
13-
body: Buffer.from(event.body, event.isBase64Encoded ? 'base64' : 'utf8'),
19+
body:
20+
event.body !== undefined && event.body !== null
21+
? Buffer.from(event.body, event.isBase64Encoded ? 'base64' : 'utf8')
22+
: undefined,
1423
remoteAddress: '',
1524
url: url.format({
1625
pathname: event.path,
@@ -19,5 +28,6 @@ export const constructFrameworkContext = (event: Event, context: Context) => {
1928
isBase64Encoded: event.isBase64Encoded,
2029
});
2130
const response = new ServerlessResponse(request);
31+
2232
return { request, response };
2333
};

src/serverlessRequest.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ interface ServerlessRequestOptions {
77
method: string;
88
url: string;
99
headers: { [key: string]: string | number };
10-
body: Buffer | string;
10+
body: Buffer | string | undefined;
1111
remoteAddress: string;
1212
isBase64Encoded: boolean;
1313
}
@@ -17,7 +17,7 @@ const NO_OP: (...args: unknown[]) => unknown = () => void 0;
1717
export default class ServerlessRequest extends IncomingMessage {
1818
ip: string;
1919

20-
body: Buffer | string;
20+
body: Buffer | string | undefined;
2121

2222
isBase64Encoded: boolean;
2323

@@ -41,7 +41,7 @@ export default class ServerlessRequest extends IncomingMessage {
4141
const combinedHeaders = Object.fromEntries(
4242
Object.entries({
4343
...headers,
44-
'content-length': Buffer.byteLength(body).toString(),
44+
'content-length': Buffer.byteLength(body ?? '').toString(),
4545
}).map(([key, value]) => [key.toLowerCase(), value]),
4646
);
4747

src/types.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ type AliyunApiGatewayEvent = {
77
headers: Record<string, string>;
88
queryParameters: Record<string, string>;
99
pathParameters: Record<string, string>;
10-
body: string;
10+
body?: string;
1111
isBase64Encoded: boolean;
1212
};
1313

1414
type AliyunApiGatewayContext = {
1515
requestId: string;
16+
region: string;
17+
accountId: string;
1618
credentials: {
1719
accessKeyId: string;
1820
accessKeySecret: string;
@@ -29,9 +31,9 @@ type AliyunApiGatewayContext = {
2931
name: string;
3032
logProject: string;
3133
logStore: string;
34+
qualifier: string;
35+
versionId: string;
3236
};
33-
region: string;
34-
accountId: string;
3537
tracing: {
3638
spanContext: string;
3739
jaegerEndpoint: string;
@@ -48,8 +50,8 @@ type AliyunApiGatewayContext = {
4850
};
4951

5052
export type Event = AliyunApiGatewayEvent;
51-
5253
export type Context = AliyunApiGatewayContext;
54+
5355
export type ServerlessAdapter = (app: Express) => (
5456
event: Event,
5557
context: Context,

tests/fixtures/fcContext.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { Context, Event } from '../../src/types';
2+
3+
export const defaultEvent: Event = {
4+
path: '/api/test',
5+
httpMethod: 'GET',
6+
headers: {
7+
'Content-Type': 'application/json',
8+
Authorization: 'Bearer sampleToken',
9+
},
10+
queryParameters: {
11+
param1: 'value1',
12+
param2: 'value2',
13+
},
14+
pathParameters: {
15+
id: '123',
16+
},
17+
body: '{"key":"value"}',
18+
isBase64Encoded: false,
19+
};
20+
export const defaultContext: Context = {
21+
requestId: 'sample-request-id',
22+
credentials: {
23+
accessKeyId: 'sample-access-key-id',
24+
accessKeySecret: 'sample-access-key-secret',
25+
securityToken: 'sample-security-token',
26+
},
27+
function: {
28+
name: 'sample-function-name',
29+
handler: 'sample-function-handler',
30+
memory: 128,
31+
timeout: 30,
32+
initializer: 'sample-initializer',
33+
},
34+
service: {
35+
name: 'sample-service-name',
36+
logProject: 'sample-log-project',
37+
logStore: 'sample-log-store',
38+
qualifier: 'sample-qualifier',
39+
versionId: 'sample-version-id',
40+
},
41+
region: 'sample-region',
42+
accountId: 'sample-account-id',
43+
tracing: {
44+
spanContext: 'sample-span-context',
45+
jaegerEndpoint: 'sample-jaeger-endpoint',
46+
spanBaggages: {
47+
baggage1: 'value1',
48+
baggage2: 'value2',
49+
},
50+
parseOpenTracingBaggages: () => ({
51+
baggage1: 'value1',
52+
baggage2: 'value2',
53+
}),
54+
},
55+
logger: {
56+
debug: (message: string) => console.debug(message),
57+
info: (message: string) => console.info(message),
58+
warn: (message: string) => console.warn(message),
59+
error: (message: string) => console.error(message),
60+
log: (message: string) => console.log(message),
61+
},
62+
};

0 commit comments

Comments
 (0)