2015-03-31 31 views
0

我正在運行一個clojurescript(cljs)瀏覽器repl,我希望能夠將一些文本寫入本地文件。你如何寫在clojurescript文件?

我試過如下:

(spit "abc.txt" "hello") 

但這返回:

#<TypeError: Cannot read property 'call' of undefined> 
TypeError: Cannot read property 'call' of undefined 

下一個Clojure的REPL,這將在我的項目的根目錄創建文件 「的abc.txt」。

我意識到'吐是一個clojure函數,但我不知道是否也有一些簡單的方法在cljs中做到這一點?

或者這是嚴格的JavaScript問題,與clojurescript本身無關?

+0

你只能用文件記錄器API,它目前只有Chrome瀏覽器支持這樣做:http://caniuse.com/#feat=filesystem – ClojureMostly 2015-04-09 17:21:23

回答

4

從瀏覽器我認爲你不能(像在JS),因爲安全

從檢查的NodeJS的文檔的NodeJS :)

現在,如果你在閃光燈的一點點混合(議員:| ...)有一個JS庫那(您可以在cljs使用)。

https://github.com/dcneiner/Downloadify

0

我張貼此作爲一個例子的解決方案,而我不是說這是你應該怎麼做。然而,我確實遇到了一些「陷阱」,所以我認爲這是值得記錄的。

謝謝你的回答。我只是試圖找出是否有一些更簡單的方法,然後再做我知道我不該做的事情。我決定用服務器端寫入。

我正在使用蘋果酒,栗子和與chrome客戶端接口的brepl服務器。由於我不熟悉環形服務器,compojure和嵌入式jetty服務器,因此我不知道如何將Web服務添加到brepl服務器(端口10555)。相反,我添加了一個到我的本地apache服務器。

因爲請求是從碼頭服務器(如從瀏覽器相對),我是越來越「跨源資源共享」的問題,即消息阿帕奇:

No 'Access-Control-Allow-Origin' header is present on the requested resource. 

每當我提交了請求我的服務的URL。

我能夠通過增加來解決這個問題,下面我的HTTP標頭:

 -access_control_allow_credentials => 'true', 
    -access_control_allow_origin => 'http://localhost:10555', 

這是他們唯一的疑難雜症。除此之外,這是一個標準的cgi解決方案(是的,老派 - 我來自perl背景)。是的,我知道如果我可以在clojure(或Rails)中完成它,那將是最好的。

我的CGI結束了看起來像:

#!/usr/bin/perl 
use CGI qw(:standard); 
print header(
      -type => 'text/html', 
      -access_control_allow_credentials => 'true', 
      -access_control_allow_origin => 'http://localhost:10555', 
        ); 

my $q = CGI->new(); 
my $src = $q->param('src'); 

# write to file 
open(my $fh, ">>", "vt-src-out.txt") 
    or die "cannot open < vt-src-out.txt: $!"; 

print $fh "$src\n"; 

我使用AJAX。核心爲我的客戶端API:

:require [ajax.core :refer [GET POST]] 

,並呼籲像服務:

(GET "http://localhost/cgi-bin/cljs-write-src.cgi" {:params {:src "(defn foo [])(+ 1 1)"}}) 
0

Node.js的例子。

比編寫一個CGI更少麻煩。 新的node.js,所以只是一個初學者。沒有轉換成cljs。

// to run: 
// node write_file.js 
// to call from cmd line: 
// curl localhost:9090?fn=test.txt\&msg=hello%20world 

var http = require('http'); 

var fs = require('fs'); 
var url = require('url'); 

var server = http.createServer(function(req, res) { 
var fn = url.parse(req.url, true).query['fn']; 
var msg = url.parse(req.url, true).query['msg']; 

fs.writeFile(process.env.HOME + "/vtstuff/tmp/" + fn, msg + "\n",    
    function(err) { 

    if(err) { 
     return console.log(err); 
    } 

    console.log("The file was saved!"); 
    console.log("fn=" + fn); 
    console.log("msg=" + msg); 
    process.argv.forEach(function (val, index, array) { 
     console.log(index + ': ' + val); 
    }); 
    }); 
    res.writeHead(200,{"Content-Type": "text/plain"}); 
    res.end("wrote file\n"); 
}); 

server.listen(9090);