Golang Otto JS-将主机对象暴露给JavaScript
Golang Otto JS - Expose host object to JavaScript
我正试图向Otto JavaSCript运行时公开一个现有的Go对象。对象是公开的,我可以看到它,但当我调用影响公开对象状态的方法时,我会感到恐慌和错误,甚至Otto会默默地忽略它!
Golang代码:
package main
import (
"bytes"
"fmt"
"log"
"os"
"github.com/robertkrimen/otto"
)
type BensObject struct {
name string
}
func (b BensObject) SetName(name string) {
fmt.Println("INT: ", name)
b.name = name
fmt.Println("INT: ", b.name)
}
func (b BensObject) GetName() string {
fmt.Println("INT: ", b.name)
return b.name
}
func (b BensObject) Age() int {
return 36
}
func (b BensObject) AddToAge(n int) int {
return 36 + n
}
func main() {
runtime := loadPluginRuntime("plugins.js")
// If we don't have a runtime all requests are accepted
if runtime == nil {
os.Exit(-1)
}
r := new(BensObject)
v, err := runtime.ToValue(*r)
if err != nil {
log.Fatal(err)
}
// By convention we will require plugins have a set name
result, err := runtime.Call("checkRequest", nil, v)
if err != nil {
log.Fatal(err)
}
// If the js function did not return a bool error out
// because the plugin is invalid
out, err := result.ToBoolean()
if err != nil {
log.Fatalf("'"checkRequest'" must return a boolean. Got %s", err)
}
fmt.Println(out)
}
func loadPluginRuntime(name string) *otto.Otto {
f, err := os.Open(name)
if err != nil {
if os.IsNotExist(err) {
return nil
}
log.Fatal(err)
}
defer f.Close()
buff := bytes.NewBuffer(nil)
if _, err := buff.ReadFrom(f); err != nil {
log.Fatal(err)
}
runtime := otto.New()
// Load the plugin file into the runtime before we
// return it for use
if _, err := runtime.Run(buff.String()); err != nil {
log.Fatal(err)
}
return runtime
}
JavaScript代码:
var getKeys = function(obj){
var keys = [];
for(var key in obj){
keys.push(key);
}
return keys;
}
function checkRequest(r) {
console.log(r);
r.SetName("Ben");
console.log(r.GetName());
console.log(getKeys(r));
console.log(r.Name);
console.log(r.Age());
console.log(r.AddToAge(10));
return true
}
有人有什么见解吗?有人能够向Ottos运行时公开已经存在的带有方法的大型对象结构吗?我有一个非常大的Go包,我想直接向Otto运行时公开,而不必做太多繁琐和脆弱的JS"映射"。
你好,请尝试将指向对象的指针放入运行时。使用*BensObject并更改方法以获取指针接收器:func(b*BensObject)SetName(名称字符串){…}更改运行时。ToValue(*r)到运行时。ToValue(r)。
基本上,每次调用上的方法时,BensObject都会被复制它,所以变化没有得到反映。
这解决了问题,对象正确地共享给Otto运行时,并且通过方法进行的更改得到了正确的反映。
相关文章:
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 使用php或javascript从facebook相册URL中删除多余的部分
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 如何在JavaScript中将字符串转换为函数引用
- 模糊事件的Javascript测试
- ADAL - 在SPA应用程序中的Angular JS中使用的JavaScript,用于调用通过APIGEE暴露的第三方
- 如何弃用 flash/flex 暴露的 JavaScript 函数
- Javascript:封装状态,暴露行为
- 在android浏览器中,Javascript菜单向左移动,并暴露屏幕右侧的间隙
- 使用JavaScript搜索四方而不暴露客户端秘密
- 如何可能不暴露你的秘密密钥与Javascript OAuth库
- 将整个Freemarker数据模型暴露给JavaScript
- 将javascript逻辑暴露给web服务
- 通过Firebreath框架从javascript中暴露c#类
- Golang Otto JS-将主机对象暴露给JavaScript
- 如何在Javascript中从对象中暴露数据
- 在javascript中暴露MySQL表名是否存在安全风险?
- 可能来自暴露链接的 JavaScript 漏洞