You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:45:35