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

如何在Node.js中运行带导出API的Go WASM程序并调用接口

解决Go WASM在Node.js环境中无法调用全局API的问题

问题核心

Go编写的WASM程序在浏览器中能正常调用挂载到全局对象的myEchoAPI,但在Node.js环境下直接通过node wasm_exec.js myecho.wasm运行时,无法访问该API,也无法实现传参和接收返回值的自动化测试需求。

原因分析

  1. 交互限制:默认运行方式启动WASM后,会直接进入Go代码的select{}阻塞逻辑,没有预留外部代码调用API的时机。
  2. 全局对象适配:虽然浏览器和Node.js的全局对象不同,但Go的js.Global()在官方wasm_exec.js的适配下已兼容两者,核心问题并非对象指向错误。

解决方案

1. 调整Go代码(确保全局对象兼容)

使用js.Global()挂载API,兼容浏览器与Node.js环境,同时保留阻塞逻辑避免程序提前退出:

package main

import "syscall/js"

func myEcho(_ js.Value, args []js.Value) interface{} {
	if len(args) == 0 {
		return ""
	}
	return args[0].String()
}

func main() {
	// 获取兼容多环境的全局对象
	global := js.Global()
	// 将myEcho挂载到全局对象
	global.Set("myEcho", js.FuncOf(myEcho))

	// 阻塞进程,防止WASM程序退出
	select {}
}

2. 编译WASM程序

执行Go交叉编译命令生成WASM文件:

GOOS=js GOARCH=wasm go build -o myecho.wasm main.go

3. 编写Node.js自定义执行脚本

创建run_wasm.js脚本,实现WASM加载、运行及API调用的完整流程:

const fs = require('fs');
const path = require('path');
const { argv } = require('process');

// 加载官方WASM执行环境(需先复制wasm_exec.js到当前目录)
eval(fs.readFileSync(path.join(__dirname, 'wasm_exec.js'), 'utf8'));

const go = new Go();
const wasmPath = path.join(__dirname, argv[2]);

// 读取并实例化WASM模块
WebAssembly.instantiate(fs.readFileSync(wasmPath), go.importObject)
  .then(result => {
    // 启动WASM程序
    go.run(result.instance);

    // 调用WASM挂载的全局API,执行测试逻辑
    const testInput = "Node.js调用Go WASM测试";
    const echoResult = globalThis.myEcho(testInput);
    console.log("测试输入:", testInput);
    console.log("返回结果:", echoResult);

    // 测试完成后主动退出进程,破解Go的阻塞逻辑
    process.exit(0);
  })
  .catch(err => {
    console.error("加载WASM失败:", err);
    process.exit(1);
  });

注意:需将Go安装目录下的wasm_exec.js(路径为$(go env GOROOT)/misc/wasm/wasm_exec.js)复制到当前脚本目录。

4. 运行自动化测试

执行以下命令启动测试:

node run_wasm.js myecho.wasm

关键说明

  • 自定义脚本通过手动实例化WASM模块,在go.run()完成后(即Go代码进入阻塞前),主动调用全局对象上的myEchoAPI,实现交互测试。
  • 测试结束后必须调用process.exit(0)终止进程,否则会被Go的select{}逻辑一直阻塞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:30:53