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

Flutter HTTP POST请求JSON处理异常,Node.js后端无法还原数据类型

Flutter与Node.js交互JSON数据处理最佳实践

问题根源

你当前的实现存在两个导致类型丢失的问题:

  1. 传递给jsonEncode的Map声明了<String, String>泛型,强制所有值只能为字符串类型
  2. 对所有参数统一调用toString(),直接覆盖了数值、日期的原始类型特性

前端(Flutter)侧实现规范

  • 动态类型映射:序列化JSON时使用<String, dynamic>作为Map的泛型,允许存放不同类型的值
  • 数值类型处理:如果参数是金额、数量等数值类型,先转换为int/double类型再放入JSON,不要调用toString()
  • 日期类型处理:使用ISO8601标准格式传递日期,调用DateTime的toIso8601String()方法,该格式是前后端通用的日期序列化标准,可被所有主流后端语言直接解析
  • 空值安全处理:可空参数要做好空判断,避免把null.toString()的"null"字符串传递到后端

修正后的代码示例

Future<PlanDataInit> createItin(String? name, String? budget,
DateTime? startDate, DateTime? endDate) async {
  final response = await http.post(
    Uri.parse('http://localhost:3001/itinerary/createitin'),
    headers: <String, String>{
      'Content-Type': 'application/json; charset=UTF-8',
    },
    body: jsonEncode(<String, dynamic>{
      "Name": name,
      "startDate": startDate?.toIso8601String(),
      "endDate": endDate?.toIso8601String(),
      // 如果budget是整数金额就转int,是小数就转double,空值直接传null
      "initialBud": budget != null ? int.parse(budget) : null
    }),
  );
  // 后续原有逻辑
}

后端(Node.js)侧处理规范

  • 开启JSON解析中间件:如果使用Express框架,确保全局配置了app.use(express.json()),会自动将请求体中的JSON字符串解析为对应类型的JS对象
  • 数值类型无需额外转换:前端传递的int/double类型会被自动解析为JS的number类型
  • 日期类型转换:拿到前端传递的ISO8601字符串后,直接调用new Date(isoStr)即可转换为JS Date对象,也可配合dayjs等日期工具库做后续处理
  • 可选:添加参数校验层,使用zod、joi等校验库对入参类型做校验,异常类型直接返回参数错误提示,避免业务逻辑出现类型错误

简单的Express接收示例

const express = require('express')
const app = express()
// 必须开启JSON解析
app.use(express.json())

app.post('/itinerary/createitin', (req, res) => {
  const { Name, startDate, endDate, initialBud } = req.body
  console.log(typeof initialBud) // 输出number,不是string
  const startDateTime = new Date(startDate) // 直接转为JS Date对象
  // 后续业务逻辑
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:45:02