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

使用wasm-bindgen在Node.js WebAssembly中如何从Rust函数返回字符串?

问题根因

你直接加载裸WASM文件调用带字符串参数/返回值的函数的方式是错误的:

  • WASM本身原生仅支持数字类型的入参和返回值,字符串这种复杂类型需要wasm-bindgen生成的JS胶水层做JS运行时和WASM线性内存之间的读写转换,你跳过胶水层直接调用原生导出的greet,传入的JS字符串无法被WASM识别,自然拿不到正确的返回值。
  • 你参考的教程是针对无依赖、仅用基础数字类型的最简WASM用例,不适用引入了wasm-bindgen的Rust WASM项目。

正确解决方法

第一步:确认编译命令正确

用wasm-pack编译时指定target为nodejs:

wasm-pack build --target nodejs

编译完成后pkg目录下会自动生成对应JS胶水文件,无需你手动读取WASM文件做实例化。

第二步:修改Node.js代码

直接导入胶水文件暴露的接口即可:

const { greet } = require("../pkg/hello_world");
const greeting = greet("Simon");
console.log("x", greeting);

运行后即可正常输出x Hello Simon。

补充说明(可选)

如果你一定要手动实例化WASM,需要额外处理内存逻辑:
原生导出的greet实际入参是2个i32类型数字,分别为字符串在WASM线性内存中的指针、字符串长度,返回值也是指向WASM堆上字符串的i32指针。你需要手动把JS字符串编码为Uint8Array,调用WASM的内存分配接口写入对应内存地址,调用函数后再从返回的指针位置读取内存解码为JS字符串,最后还要手动释放对应内存,流程非常繁琐,日常开发直接用wasm-bindgen生成的胶水层即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:24:03