Skip to content

Commit 3f4cb5c

Browse files
committed
feat: optimize json response
1 parent e7205c1 commit 3f4cb5c

File tree

7 files changed

+162
-80
lines changed

7 files changed

+162
-80
lines changed

__test__/index.spec.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,16 @@ test('GET: 200', async () => {
3232

3333
test('GET: string', async () => {
3434
const text = 'test'
35-
const res = await client.texts.$get({ query: { val: text } })
36-
expect(res).toBe(text)
35+
const res = await client.texts.get({ query: { val: text } })
36+
expect(res.body).toBe(text)
37+
expect(res.headers['content-type']).toBe('text/html; charset=utf-8')
3738
})
3839

3940
test('GET: params.userId', async () => {
4041
const userId = 1
41-
const res = await client.users._userId(userId).$get()
42-
expect(res.id).toBe(userId)
42+
const res = await client.users._userId(userId).get()
43+
expect(res.body.id).toBe(userId)
44+
expect(res.headers['content-type']).toBe('application/json; charset=utf-8')
4345
})
4446

4547
test('GET: 400', async () => {

servers/all/$server.ts

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,21 @@ const methodToHandler = (
160160
try {
161161
const data = methodCallback(req as any) as any
162162

163-
for (const key in data.headers) {
164-
res.setHeader(key, data.headers[key])
165-
}
163+
if (typeof data.body === 'object' && data.body !== null) {
164+
res.set('content-type', 'application/json; charset=utf-8')
166165

167-
res.status(data.status).send(data.body)
166+
for (const key in data.headers) {
167+
res.setHeader(key, data.headers[key])
168+
}
169+
170+
res.status(data.status).send(JSON.stringify(data.body))
171+
} else {
172+
for (const key in data.headers) {
173+
res.setHeader(key, data.headers[key])
174+
}
175+
176+
res.status(data.status).send(data.body)
177+
}
168178
} catch (e) {
169179
next(e)
170180
}
@@ -176,11 +186,21 @@ const asyncMethodToHandler = (
176186
try {
177187
const data = await methodCallback(req as any) as any
178188

179-
for (const key in data.headers) {
180-
res.setHeader(key, data.headers[key])
181-
}
189+
if (typeof data.body === 'object' && data.body !== null) {
190+
res.set('content-type', 'application/json; charset=utf-8')
182191

183-
res.status(data.status).send(data.body)
192+
for (const key in data.headers) {
193+
res.setHeader(key, data.headers[key])
194+
}
195+
196+
res.status(data.status).send(JSON.stringify(data.body))
197+
} else {
198+
for (const key in data.headers) {
199+
res.setHeader(key, data.headers[key])
200+
}
201+
202+
res.status(data.status).send(data.body)
203+
}
184204
} catch (e) {
185205
next(e)
186206
}

servers/minimum/$server.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,21 @@ const methodToHandler = (
5252
try {
5353
const data = methodCallback(req as any) as any
5454

55-
for (const key in data.headers) {
56-
res.setHeader(key, data.headers[key])
57-
}
55+
if (typeof data.body === 'object' && data.body !== null) {
56+
res.set('content-type', 'application/json; charset=utf-8')
5857

59-
res.status(data.status).send(data.body)
58+
for (const key in data.headers) {
59+
res.setHeader(key, data.headers[key])
60+
}
61+
62+
res.status(data.status).send(JSON.stringify(data.body))
63+
} else {
64+
for (const key in data.headers) {
65+
res.setHeader(key, data.headers[key])
66+
}
67+
68+
res.status(data.status).send(data.body)
69+
}
6070
} catch (e) {
6171
next(e)
6272
}

servers/noMulter/$server.ts

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,21 @@ const methodToHandler = (
8686
try {
8787
const data = methodCallback(req as any) as any
8888

89-
for (const key in data.headers) {
90-
res.setHeader(key, data.headers[key])
89+
if (typeof data.body === 'object' && data.body !== null) {
90+
res.set('content-type', 'application/json; charset=utf-8')
91+
92+
for (const key in data.headers) {
93+
res.setHeader(key, data.headers[key])
94+
}
95+
96+
res.status(data.status).send(JSON.stringify(data.body))
97+
} else {
98+
for (const key in data.headers) {
99+
res.setHeader(key, data.headers[key])
100+
}
101+
102+
res.status(data.status).send(data.body)
91103
}
92-
93-
res.status(data.status).send(data.body)
94104
} catch (e) {
95105
next(e)
96106
}
@@ -102,11 +112,21 @@ const asyncMethodToHandler = (
102112
try {
103113
const data = await methodCallback(req as any) as any
104114

105-
for (const key in data.headers) {
106-
res.setHeader(key, data.headers[key])
115+
if (typeof data.body === 'object' && data.body !== null) {
116+
res.set('content-type', 'application/json; charset=utf-8')
117+
118+
for (const key in data.headers) {
119+
res.setHeader(key, data.headers[key])
120+
}
121+
122+
res.status(data.status).send(JSON.stringify(data.body))
123+
} else {
124+
for (const key in data.headers) {
125+
res.setHeader(key, data.headers[key])
126+
}
127+
128+
res.status(data.status).send(data.body)
107129
}
108-
109-
res.status(data.status).send(data.body)
110130
} catch (e) {
111131
next(e)
112132
}

servers/noTypedParams/$server.ts

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,21 @@ const methodToHandler = (
110110
try {
111111
const data = methodCallback(req as any) as any
112112

113-
for (const key in data.headers) {
114-
res.setHeader(key, data.headers[key])
113+
if (typeof data.body === 'object' && data.body !== null) {
114+
res.set('content-type', 'application/json; charset=utf-8')
115+
116+
for (const key in data.headers) {
117+
res.setHeader(key, data.headers[key])
118+
}
119+
120+
res.status(data.status).send(JSON.stringify(data.body))
121+
} else {
122+
for (const key in data.headers) {
123+
res.setHeader(key, data.headers[key])
124+
}
125+
126+
res.status(data.status).send(data.body)
115127
}
116-
117-
res.status(data.status).send(data.body)
118128
} catch (e) {
119129
next(e)
120130
}
@@ -126,11 +136,21 @@ const asyncMethodToHandler = (
126136
try {
127137
const data = await methodCallback(req as any) as any
128138

129-
for (const key in data.headers) {
130-
res.setHeader(key, data.headers[key])
131-
}
139+
if (typeof data.body === 'object' && data.body !== null) {
140+
res.set('content-type', 'application/json; charset=utf-8')
132141

133-
res.status(data.status).send(data.body)
142+
for (const key in data.headers) {
143+
res.setHeader(key, data.headers[key])
144+
}
145+
146+
res.status(data.status).send(JSON.stringify(data.body))
147+
} else {
148+
for (const key in data.headers) {
149+
res.setHeader(key, data.headers[key])
150+
}
151+
152+
res.status(data.status).send(data.body)
153+
}
134154
} catch (e) {
135155
next(e)
136156
}

servers/noValidator/$server.ts

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,21 @@ const methodToHandler = (
120120
try {
121121
const data = methodCallback(req as any) as any
122122

123-
for (const key in data.headers) {
124-
res.setHeader(key, data.headers[key])
123+
if (typeof data.body === 'object' && data.body !== null) {
124+
res.set('content-type', 'application/json; charset=utf-8')
125+
126+
for (const key in data.headers) {
127+
res.setHeader(key, data.headers[key])
128+
}
129+
130+
res.status(data.status).send(JSON.stringify(data.body))
131+
} else {
132+
for (const key in data.headers) {
133+
res.setHeader(key, data.headers[key])
134+
}
135+
136+
res.status(data.status).send(data.body)
125137
}
126-
127-
res.status(data.status).send(data.body)
128138
} catch (e) {
129139
next(e)
130140
}
@@ -136,11 +146,21 @@ const asyncMethodToHandler = (
136146
try {
137147
const data = await methodCallback(req as any) as any
138148

139-
for (const key in data.headers) {
140-
res.setHeader(key, data.headers[key])
141-
}
149+
if (typeof data.body === 'object' && data.body !== null) {
150+
res.set('content-type', 'application/json; charset=utf-8')
142151

143-
res.status(data.status).send(data.body)
152+
for (const key in data.headers) {
153+
res.setHeader(key, data.headers[key])
154+
}
155+
156+
res.status(data.status).send(JSON.stringify(data.body))
157+
} else {
158+
for (const key in data.headers) {
159+
res.setHeader(key, data.headers[key])
160+
}
161+
162+
res.status(data.status).send(data.body)
163+
}
144164
} catch (e) {
145165
next(e)
146166
}

src/buildServerFile.ts

Lines changed: 30 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,34 @@
11
import path from 'path'
22
import createControllersText from './createControllersText'
33

4+
const genHandlerText = (isAsync: boolean) => `
5+
const ${isAsync ? 'asyncM' : 'm'}ethodToHandler = (
6+
methodCallback: ServerMethods<any, any>[LowerHttpMethod]
7+
): RequestHandler => ${isAsync ? 'async ' : ''}(req, res, next) => {
8+
try {
9+
const data = ${isAsync ? 'await ' : ''}methodCallback(req as any) as any
10+
11+
if (typeof data.body === 'object' && data.body !== null) {
12+
res.set('content-type', 'application/json; charset=utf-8')
13+
14+
for (const key in data.headers) {
15+
res.setHeader(key, data.headers[key])
16+
}
17+
18+
res.status(data.status).send(JSON.stringify(data.body))
19+
} else {
20+
for (const key in data.headers) {
21+
res.setHeader(key, data.headers[key])
22+
}
23+
24+
res.status(data.status).send(data.body)
25+
}
26+
} catch (e) {
27+
next(e)
28+
}
29+
}
30+
`
31+
432
export default (input: string, project?: string) => {
533
const { imports, consts, controllers } = createControllersText(`${input}/api`, project ?? input)
634
const hasNumberTypeQuery = controllers.includes(' parseNumberTypeQueryParams(')
@@ -181,46 +209,8 @@ const formatMulterData = (arrayTypeKeys: [string, boolean][]): RequestHandler =>
181209
}
182210
`
183211
: ''
184-
}${
185-
hasMethodToHandler
186-
? `
187-
const methodToHandler = (
188-
methodCallback: ServerMethods<any, any>[LowerHttpMethod]
189-
): RequestHandler => (req, res, next) => {
190-
try {
191-
const data = methodCallback(req as any) as any
192-
193-
for (const key in data.headers) {
194-
res.setHeader(key, data.headers[key])
195-
}
196-
197-
res.status(data.status).send(data.body)
198-
} catch (e) {
199-
next(e)
200-
}
201-
}
202-
`
203-
: ''
204-
}${
205-
hasAsyncMethodToHandler
206-
? `
207-
const asyncMethodToHandler = (
208-
methodCallback: ServerMethods<any, any>[LowerHttpMethod]
209-
): RequestHandler => async (req, res, next) => {
210-
try {
211-
const data = await methodCallback(req as any) as any
212-
213-
for (const key in data.headers) {
214-
res.setHeader(key, data.headers[key])
215-
}
216-
217-
res.status(data.status).send(data.body)
218-
} catch (e) {
219-
next(e)
220-
}
221-
}
222-
`
223-
: ''
212+
}${hasMethodToHandler ? genHandlerText(false) : ''}${
213+
hasAsyncMethodToHandler ? genHandlerText(true) : ''
224214
}
225215
export default (app: Express, options: FrourioOptions = {}) => {
226216
const basePath = options.basePath ?? ''

0 commit comments

Comments
 (0)