NestJS POST请求Body始终为空的问题求助
问题原因
你遇到的@Body()获取到空对象的问题,核心原因是客户端发送JSON字符串时未设置Content-Type: application/json请求头。NestJS内置的body解析器仅会自动解析带有该头的请求,否则会忽略请求体内容,最终导致获取到空对象{}。
解决方案
以下两种修复方式任选其一即可:
方式1:手动添加Content-Type请求头
在客户端构建请求时,给请求头添加Content-Type字段,明确告知服务端请求体格式:
public async genereateGraph(cd_algorithm: string, recovery_algorithm: string, delimiter?: string, identifier?: string){ delimiter = ","; const requestBody: IStartCausalDiscovery = {delimiter, cd_algorithm, recovery_algorithm}; // 新增Content-Type头 const headers = { session: await SessionService.ensureSession(), 'Content-Type': 'application/json' }; const result = await ApiService.post<SuccessResponse>( '/CausalDiscovery/generate', JSON.stringify(requestBody), undefined, headers, ); return result.success; }
方式2:让ApiService自动处理JSON请求体
修改ApiService.post方法,支持直接传入JavaScript对象,自动完成JSON序列化并设置请求头,后续所有POST请求都无需重复处理格式问题:
public static async post<T>(route: string, body?: BodyInit | Record<string, any>, query?: queryString.StringifiableRecord, headers?: Record<string, string>): Promise<T> { let url = `${BASE_URL}${route}`; if(query != null) { url += `?${queryString.stringify(query)}`; } let fetchBody: BodyInit | undefined; const fetchHeaders = { ...headers }; // 自动处理非FormData的对象类型body if (body && typeof body === 'object' && !(body instanceof FormData)) { fetchBody = JSON.stringify(body); fetchHeaders['Content-Type'] = 'application/json'; } else { fetchBody = body as BodyInit; } return new Promise((resolve, reject) => { fetch(url, { method: 'POST', body: fetchBody, headers: fetchHeaders }) .then(response => response.json()) .then(data => { if(data.success != true) { throw new Error(data.errorMessage); } resolve(data); }) .catch(err => reject(err)); }); }
修改后客户端调用时可直接传递对象,无需手动执行JSON.stringify:
const result = await ApiService.post<SuccessResponse>( '/CausalDiscovery/generate', requestBody, // 直接传递对象 undefined, { session: await SessionService.ensureSession() }, );
验证
修改完成后重启服务端和客户端,再次调用接口,服务端的console.log(body)即可正确打印出请求体内容。
内容的提问来源于stack exchange,提问作者Lorenz Aichner
相关产品推荐
相关产品推荐

