Tauri 中如何正确将 JavaScript Map 传递给 Rust 后端

星宇吖_4215

星宇吖_4215

2026-04-07

453人浏览

原创

Tauri 的 invoke 不支持直接序列化 JavaScript Map,需先转换为普通对象(Object.fromEntries([...map.entries()])),Rust 端才能正确接收并反序列化为 HashMap。

tauri 的 `invoke` 不支持直接序列化 javascript `map`,需先转换为普通对象(`object.fromentries([...map.entries()])`),rust 端才能正确接收并反序列化为 `hashmap`。

在 Tauri 应用中,前端 JavaScript 与后端 Rust 之间的数据通信依赖于 JSON 序列化。而 JavaScript 的 Map 对象不是 JSON 可序列化的原生类型——JSON.stringify(new Map([['a', 1]])) 会返回 {},导致数据丢失。这正是你遇到 items 在 Rust 端为空 {} 的根本原因。

✅ 正确做法是:在调用 invoke 前,将 Map 显式转换为标准 JavaScript 对象(plain object),即键值对结构的 { "key1": value1, "key2": value2 }。Rust 的 serde_json 可无缝将其反序列化为 HashMap。

javascript-pro
javascript-pro

专注现代 ECMAScript、异步编程、性能优化和全栈的 JavaScript 专家,适用于现代开发

下载

✅ 前端处理:Map ↔ Object 双向转换

// 工具函数:Map → Plain Object(用于发送)
const mapToObj = <k extends string number v>(map: Map<k v>): Record<k v> => 
  Object.fromEntries(map.entries()) as Record<k v>;

// 工具函数:Plain Object → Map(用于接收响应或本地复用)
const objToMap = <k extends string number v>(obj: Record<k v>): Map<k v> => 
  new Map(Object.entries(obj) as [K, V][]);

// 预处理提交数据
const serializableDetails = (details: any) => ({
  ...details,
  items: mapToObj(details.items) // 关键:转换 Map
});</k></k></k></k></k></k></k>

✅ 前端调用示例(React + TypeScript)

async function handleSubmit(e: React.FormEvent) {
  e.preventDefault();
  console.log('原始数据:', details); // Map(1) {'3' => 1}

  try {
    const result = await invoke<boolean>('submit_new_customer', {
      details: serializableDetails(details) // ← 转换后传入
    });
    console.log('提交成功:', result);
  } catch (error) {
    console.error('提交失败:', error);
  }
}</boolean>

✅ Rust 后端:保持原有结构(无需修改)

use std::collections::HashMap;
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Debug)]
struct NewCustomerInput {
    name: String,
    country: String,
    address: Option<string>,
    items: HashMap<string usize>, // ✅ 完全兼容 JSON object → HashMap
}

#[tauri::command]
fn submit_new_customer(details: NewCustomerInput) -> Result {
    println!("收到数据: {:?}", details);
    // 输出示例: items: {"3": 1} → 自动映射为 HashMap{"3" => 1}
    Ok(())
}</string></string>

⚠️ 注意事项

  • ❌ 不要尝试在 JS 中直接 JSON.stringify(map) 或 invoke(..., { items: map }) —— Map 会被忽略;
  • ✅ 所有键必须为字符串(Map),因 JSON object 的 key 强制转为字符串,Map 的数字 key 会被序列化为字符串(如 42 → "42"),Rust 端仍可正常接收;
  • ? 若需在 Rust 返回数据中携带 HashMap 到前端,serde 会自动转为 JS object,前端可用 objToMap() 还原为 Map;
  • ? 调试建议:在 invoke 前 console.log(JSON.stringify(serializableDetails(details))),确认 items 已变为 { "3": 1 } 形式。

通过这一标准化转换,即可在 Tauri 应用中安全、可靠地跨语言传递键值集合数据。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2703

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6830

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6286

10

js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

5286

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1289

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

5224

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

1000

4

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1936

5

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

2023.09.04

3705

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习