golang 执行js代码。 调试及 goja 中js 代码报错 require

模拟前端密码js加密,后端测试时使用

使用goja

目录

模拟前端密码js加密,后端测试时使用

1、js代码报错,调试js 代码

2、前端加密使用jsencrypt,遇到问题

3、import 或 require 报错。


遇到的问题:

1、js代码报错,调试js 代码

Visual Studio Code  中安装code runner插件

安装node 

修改vs code配置settings.json 中增加行

"code-runner.runInTerminal":true,

"code-runner.executorMap":{ "javascript": "D:\\\\tools\\nodejs\\node.exe", },

2、前端加密js使用jsencrypt,遇到问题

 https://github.com/travist/jsencrypt.git

遇到问题

1)bin目录下文件jsencrypt.min.js,会报错 不支持window对象 

使用https://studygolang.com/articles/35387?fr=sidebar

修改的文件。

3、import 或 require 报错。

支持的js 语法目前只支持require。同时要增加下面的注册

registry := new(require.Registry)
    registry.Enable(vm) 


import (
	"fmt"
	"os"

	"encoding/base64"

	"github.com/dop251/goja"
	"github.com/dop251/goja_nodejs/require"
	"github.com/wumansgy/goEncrypt"
)

func JsDoEncrypt(inV string) (outEncV string, err error) {
	var script = `		
	function GenEnc(inV, pubKey) {
		const jsencrypt = require('./jsencrypt.min.js');
		let encrypt = new jsencrypt.JSEncrypt();
		encrypt.setPublicKey(pubKey);
		return encrypt.encrypt(inV);	
	}	
	`
	//
	vm := goja.New()
	registry := new(require.Registry)
	registry.Enable(vm)

	_, err = vm.RunString(script)
	if err != nil {
		// global.G_LOG.Info("[%s]JS代码有问题",w.TraceId)
		fmt.Println("JS代码有问题")
		return
	}
	var fn func(string, string) string
	err = vm.ExportTo(vm.Get("GenEnc"), &fn)
	if err != nil {
		fmt.Println("Js函数映射到 Go 函数失败!")
		return
	}
	//
	file, err := os.Open("public.pem")
	if err != nil {
		fmt.Println("open publicKey file err:", err)
		return
	}
	defer file.Close()
	//获取文件内容
	info, _ := file.Stat()
	buf := make([]byte, info.Size())
	file.Read(buf)
	//
	outEncV = fn(inV, string(buf))
	// fmt.Println("加密后为:", outEncV)
	return
}

       参考文章:

https://www.cnblogs.com/ZYSZBD/p/14929855.html

https://studygolang.com/articles/35387?fr=sidebar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Golang执行JavaScript代码可以使用第三方库,例如github.com/dop251/goja。首先,你需要导入所需的包,然后创建一个JavaScript虚拟机对象。接下来,你可以使用vm.RunString()方法来运行JavaScript代码。例如,你可以定义一个斐波那契数列的函数并在Golang调用它。下面是一个示例代码: ```go package main import ( "fmt" "github.com/dop251/goja" ) func main() { const script = ` function fib(n) { if (n === 1 || n === 2) { return 1 } return fib(n - 1) + fib(n - 2) } ` vm := goja.New() _, err := vm.RunString(script) if err != nil { fmt.Println("JS代码有问题!") return } var fn func(int32) int32 err = vm.ExportTo(vm.Get("fib"), &fn) if err != nil { fmt.Println("Js函数映射到 Go 函数失败!") return } fmt.Println("斐波那契数列第30项的值为:", fn(30)) } ``` 在这个示例,我们使用goja库创建了一个JavaScript虚拟机对象vm。然后,我们使用vm.RunString()方法运行了一个JavaScript代码块,其定义了一个斐波那契数列的函数。接下来,我们使用vm.ExportTo()方法将JavaScript函数映射到Golang函数fn。最后,我们调用fn(30)来计算斐波那契数列的第30项的值,并将结果打印出来。 #### 引用[.reference_title] - *1* *3* [用Golang运行JavaScript的实现示例](https://blog.csdn.net/yandaxia6666/article/details/103238220)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [教你如何在Golang运行JavaScript](https://blog.csdn.net/Linuxprobe18/article/details/122755031)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值