项目场景:
目的:通过otto虚拟机运行JavaScript代码,需要向该v8虚拟机中置入一个Go的对象,用来运算md5或其它功能。但发现置入以后一直提示TypeError: ‘md5’ is not a function。但另外一个例子中又是正常,找了很久,终于找到了原因。
Cry对象代码
type Cry struct{}
func (c *Cry) md5(str string) string {
return crypto.Md5(str)
}
测试代码:
app_string := `
function test(){
console.log(Object.keys(cry));
var a = cry.Md5("SGVsbG8sIFdvcmxkIQ==");
console.log("a",a);
}
`
ret_string := ""
vm := otto.New()
vm.Set("cry", &Cry{})
_, err := vm.Run(app_string)
//fmt.Println("测试", _cry.md5("123"))
if err != nil {
ret_string = "API加载异常:" + err.Error()
} else {
result, err := vm.Call("test", nil, 1, 10)
if err != nil {
ret_string = "调用API异常:" + err.Error()
} else {
ret_string, err = result.ToString()
}
}
fmt.Println("结果", ret_string)
原因分析:
应该是该虚拟机对,函数名有一定的要求。一定要首字母大写
解决方案:
修改后的代码
type Cry struct{}
func (c *Cry) Md5(str string) string {
return crypto.Md5(str)
}
`
只需要将函数名首字母大写以后就正常可以使用了!
捣鼓了几天,猝。