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

Swift结构体转JSON发送至Node.js时格式异常的解决求助

解决Swift到Node.js的JSON格式异常问题

你的问题核心是请求头配置缺失导致Node.js端无法正确解析JSON请求体,下面一步步帮你解决:

1. 修复Swift请求的Content-Type头

你的Swift代码里没有告诉服务器发送的是JSON格式的数据,这会让Node.js的解析中间件错误地把JSON当成表单数据处理,导致结构混乱。在设置request.httpBody之后添加以下代码:

request.setValue("application/json", forHTTPHeaderField: "Content-Type")

另外,建议你把Swift里打印jsonData的代码改成打印字符串,方便验证JSON格式是否正确:

if let jsonString = String(data: jsonData, encoding: .utf8) {
    print("JSON Value: \(jsonString)")
}

2. 确保Node.js正确配置JSON解析中间件

检查你的Node.js主文件(比如app.js),确保已经启用了body-parser的JSON解析中间件,如果还没加,添加以下代码:

const bodyParser = require('body-parser');
// 解析JSON格式的请求体
app.use(bodyParser.json());
// 如果需要处理表单数据可以保留,但JSON解析必须在前
app.use(bodyParser.urlencoded({ extended: true }));

3. 简化Node.js路由的解析逻辑

当请求头和中间件配置正确后,request.body就是完整的解析后的JSON对象,不需要再去取Object.keys(request.body)[0]然后手动parse了,直接使用request.body即可:

app.post("/rapportini/generarapportino", async function(request, response) {
    console.log("\n Qualcuno sta generando un rapportino");
    try {
        console.log("Parsed body: ", request.body);
        const ret = await RapportiniController.GeneraRapportino(request.body.Note);
        response.setHeader('Content-Type', 'application/json');
        response.send(JSON.stringify({ return: ret }));
    } catch(err){
        console.log("Errore generazione rapportino ", err);
        // 建议添加错误响应,让客户端知道出了问题
        response.status(500).send(JSON.stringify({ error: err.message }));
    }
});

为什么之前会报错?

因为你没有设置Content-Type: application/json请求头,Node.js的body-parser默认会把请求体当成application/x-www-form-urlencoded(表单格式)解析,把你的JSON字符串拆成了残缺的键值对(就像你服务器打印的那样),当你尝试JSON.parse那个不完整的JSON片段时,自然会抛出Unexpected end of JSON input错误。

内容的提问来源于stack exchange,提问作者riki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:36:43