環境
・macOS Big Sur ver. 12.6 (21G115)
・MacBook Air M1, 2020 メモリ 8GB
・go1.18.3 darwin/arm64
現状
FileSystemAccessAPIについて調べていた際に,読み込みだけに限定するならば,manifest.jsonを作ってやることで,パスを使ってファイルを読み込むことができるというのが見つかったので,試してみています.
http://var.blog.jp/archives/84619582.html
作ったmanifest.json
json
1{ 2 "manifest_version": 3, 3 "name": "Read File", 4 "version": "1.0", 5 6 "permissions": ["file:///*"] 7}
index.htmlと同じ階層に置いてあります.
ファイル構成
├── ast ├── docs │ ├── build.wasm │ ├── index.html │ ├── manifest.json │ └── wasm_exec.js ├── evaluator ├── lexer ├── object ├── parser ├── repl ├── server ├── token ├── wasm │ ├── melody.txt │ └── webassembly.go ├── go.mod ├── go.sum └── main.go
困っていること
JavaScript
1const xhr = new XMLHttpRequest() 2xhr.open("GET", "/Users/usrname/Go/01/src/melody.txt") 3xhr.send() 4xhr.onload = () => console.log(xhr.responseText)
これを,Goに書き換えようとしているのですが.
Go
1 XMLHttpRequest = js.Global().Get("XMLHttpRequest") 2 xhr := XMLHttpRequest.New() 3 xhr.Call("open", "GET", "/Users/usrname/Go/01/src/melody.txt") 4 xhr.Call("send") 5 if (xhr.Call("onload") != `abort` && xhr.Call("onload") != `error`){ 6 code.Set("value", string(xhr.Get("responseText"))) 7 }
のように書き換えてビルドをしてみたところ,次のようなエラーが出てしまいました,
エラー内容->追記2へ
./webassembly.go:78:29: invalid operation: xhr.Call("onload") != `abort` (mismatched types js.Value and untyped string) ./webassembly.go:78:62: invalid operation: xhr.Call("onload") != `error` (mismatched types js.Value and untyped string) ./webassembly.go:79:29: cannot convert xhr.Get("responseText") (value of type js.Value) to type string
上2つの型の不一致の部分はstring(xhr.Call("onload")) != `abort`
のようにすればエラーはなくなるのですが,これは一時凌ぎでエラーを掻い潜っているのではなくきちんと動作するのでしょうか.
また,3つめの箇所では,読み込んだファイルの内容を文字列としてcode.valueに入れたいのですが,stringで変換できない場合に他の対処法はあるのでしょうか.
追記
この状態で拡張機能をインストールすると,エラーが出てしまったので
https://www.extension.ninja/blog/post/solved-permission-is-unknown-or-url-pattern-is-malformed/
このサイトを参考にして
manifest.json
json
1{ 2 "manifest_version": 3, 3 "name": "Read File", 4 "version": "1.0", 5 6 "host_permissions": ["file:///*"] 7}
のようにしたところ,エラーがなくなりました.
また,Goで書き換えていた部分は次のようになりました.
Go
1 xhr := XMLHttpRequest.New() 2 xhr.Call("open", "GET", "file:///c:/Users/usrname/Go/01/src/melody.txt") 3 xhr.Call("send") 4 if (xhr.Get("onload").String() != `abort` && xhr.Call("onload").String() != `error`){ 5 code.Set("value", xhr.Get("responseText").String()) 6 }else{ 7 fmt.Println("fail of onload\n") 8 }
この状態でビルド,サーバーの実行を行ってブラウザに行ってボタンを押すと,次のようになりました.
onloadの部分は.Get()に変更したので関数のようにはしていないつもりなのですが,反映ができていない,もしくは,ここでのString()が不適切なので ==nullで通過させるようにしたほうがいいのかもしれません.
!= nil
にするとinvalid operation: xhr.Get("onload") != nil (mismatched types js.Value and untyped nil)
のようにエラーが吐かれました.
Chromeを再起動させて更新は行いました.
https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest/load_event
上記のサイト周りを見ているのですが,イベントは扱いが異なるのでしょうか.
ですが,Not allowedとなる理由がわかっておりません.
Console
1wasm_exec.js:349 Not allowed to load local resource: file:///c:/Users/usrname/Go/01/src/melody.txt 2syscall/js.valueCall @ wasm_exec.js:349 3$syscall_js.valueCall @ build.wasm:0xe2bf9 4$syscall_js.Value.Call @ build.wasm:0xe0da4 5$main.main.func1 @ build.wasm:0x13616e 6$wasm_pc_f_loop @ build.wasm:0xd3719 7$wasm_export_resume @ build.wasm:0xd36fa 8_resume @ wasm_exec.js:538 9(anonymous) @ wasm_exec.js:549 10wasm_exec.js:22 panic: syscall/js: Value.Call: property onload is not a function, got null
追記2
Goで書き換えていた部分を以下のように修正しました.
Go
1 xhr := XMLHttpRequest.New() 2 xhr.Call("open", "GET", "file:///c:/Users/usrname/Go/01/src/melody.txt") 3 xhr.Call("send") 4 code.Set("value", xhr.Get("responseText").String())
このようにしたのちにビルドと実行を行うと
panic: syscall/js: Value.Call: property onload is not a function, got null
はなくなり,ブラウザのコンソール上で発生するエラーは次の一つだけとなりました.
Console
1wasm_exec.js:349 Not allowed to load local resource: file:///c:/Users/usrname/Go/01/src/melody.txt 2syscall/js.valueCall @ wasm_exec.js:349 3$syscall_js.valueCall @ build.wasm:0xe2bf9 4$syscall_js.Value.Call @ build.wasm:0xe0da4 5$main.main.func1 @ build.wasm:0x13616e 6$wasm_pc_f_loop @ build.wasm:0xd3719 7$wasm_export_resume @ build.wasm:0xd36fa 8_resume @ wasm_exec.js:538 9(anonymous) @ wasm_exec.js:549
調べてみたこと
番号リストリストhttps://qiita.com/smurakami/items/1764a80f40d33dce5243
このような記事が出て,軒並み
open -a /Applications/Google\ Chrome.app --args -allow-file-access-from-files index.html
をコンソールで打ち込めと出てきますが,そういった記事は2012や2013年の記事が多く,不安になってしまいます.
https://taremimi.hatenablog.jp/entry/2018/08/10/170035
新しめのでも2018などですね.
Chromeが開いてある状態でこのコマンドを実行しても意味ないですかね.
teratail上の同様の質問で
https://teratail.com/questions/28389
このようなものがあったのですが,見てみても解決できませんでした.
https://support.apple.com/ja-jp/guide/mac-help/mchld5a35146/mac
このサイトを頼りに「ファイルとフォルダ」を見に行きもしましたが,そもそもChromeはチェックボックスすらなく,Chromeを追加できる様子でもありませんでした.
https://apple.stackexchange.com/questions/385093/how-do-i-grant-access-in-files-and-folders-in-catalina-for-chrome
このサイトではChromeが見えているので何かして追加できるのかもしれません.
回答1件
あなたの回答
tips
プレビュー