@@ -73,22 +73,19 @@ export class ExpressTemplateService extends TemplateService<ExpressApiHandlerPar
73
73
case 'body' :
74
74
return this . validationService . ValidateParam ( param , request . body , name , fieldErrors , true , undefined ) ;
75
75
case 'body-prop' :
76
- return this . validationService . ValidateParam ( param , request . body [ name ] , name , fieldErrors , true , 'body.' ) ;
76
+ return this . validationService . ValidateParam ( param , request . body ?. [ name ] , name , fieldErrors , true , 'body.' ) ;
77
77
case 'formData' : {
78
78
const files = Object . values ( args ) . filter ( p => p . dataType === 'file' || ( p . dataType === 'array' && p . array && p . array . dataType === 'file' ) ) ;
79
79
if ( ( param . dataType === 'file' || ( param . dataType === 'array' && param . array && param . array . dataType === 'file' ) ) && files . length > 0 ) {
80
- const requestFiles = request . files as { [ fileName : string ] : Express . Multer . File [ ] } ;
81
- if ( requestFiles [ name ] === undefined ) {
82
- return undefined ;
83
- }
80
+ const requestFiles = request . files as { [ fileName : string ] : Express . Multer . File [ ] } | undefined ;
84
81
85
- const fileArgs = this . validationService . ValidateParam ( param , requestFiles [ name ] , name , fieldErrors , false , undefined ) ;
82
+ const fileArgs = this . validationService . ValidateParam ( param , requestFiles ?. [ name ] , name , fieldErrors , false , undefined ) ;
86
83
if ( param . dataType === 'array' ) {
87
84
return fileArgs ;
88
85
}
89
- return fileArgs . length === 1 ? fileArgs [ 0 ] : fileArgs ;
86
+ return Array . isArray ( fileArgs ) && fileArgs . length === 1 ? fileArgs [ 0 ] : fileArgs ;
90
87
}
91
- return this . validationService . ValidateParam ( param , request . body [ name ] , name , fieldErrors , false , undefined ) ;
88
+ return this . validationService . ValidateParam ( param , request . body ?. [ name ] , name , fieldErrors , false , undefined ) ;
92
89
}
93
90
case 'res' :
94
91
return ( status : number | undefined , data : any , headers : any ) => {
@@ -114,11 +111,24 @@ export class ExpressTemplateService extends TemplateService<ExpressApiHandlerPar
114
111
Object . keys ( headers ) . forEach ( ( name : string ) => {
115
112
response . set ( name , headers [ name ] ) ;
116
113
} ) ;
114
+
115
+ // Check if the response is marked to be JSON
116
+ const isJsonResponse = response . get ( 'Content-Type' ) ?. includes ( 'json' ) || false ;
117
+
117
118
if ( data && typeof data . pipe === 'function' && data . readable && typeof data . _read === 'function' ) {
118
119
response . status ( statusCode || 200 ) ;
119
120
( data as Readable ) . pipe ( response ) ;
120
- } else if ( data !== null && data !== undefined ) {
121
- response . status ( statusCode || 200 ) . json ( data ) ;
121
+ } else if ( data !== undefined && ( data !== null || isJsonResponse ) ) {
122
+ // allow null response when it is a json response
123
+ if ( typeof data === 'number' || isJsonResponse ) {
124
+ // express treats number data as status code so use the json method instead
125
+ // or if the response was marked as json then use the json so for example strings are quoted
126
+ response . status ( statusCode || 200 ) . json ( data ) ;
127
+ } else {
128
+ // do not use json for every type since internally the send will invoke json if needed
129
+ // but for string data it will not quote it, so we can send string as plain/text data
130
+ response . status ( statusCode || 200 ) . send ( data ) ;
131
+ }
122
132
} else {
123
133
response . status ( statusCode || 204 ) . end ( ) ;
124
134
}
0 commit comments