你怎么写clojurescript中的文件?

时间:2015-03-31 01:38:44

标签: clojure clojurescript

我正在运行clojurescript(cljs)浏览器repl,我希望能够将一些文本写入本地文件。

我尝试了以下内容:

(spit "abc.txt" "hello")

但这会返回:

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

在clojure repl下,这将创建文件&#34; abc.txt&#34;在我项目的根目录中。

我意识到&#39; spit是一个clojure函数,但我想知道在cljs中是否还有一些简单的方法可以做到这一点?

或者这是一个严格的JavaScript问题,与clojurescript无关?

3 个答案:

答案 0 :(得分:4)

从浏览器我认为你不能(比如JS),因为安全

从nodejs检查nodejs doc:)

现在,如果你混合了一点闪光(yuk:| ...)那里有一个JS库(你可以在cljs中使用)。

https://github.com/dcneiner/Downloadify

答案 1 :(得分:0)

  

我发布这个作为示例解决方案,我并不是说你应该这样做。然而,我确实经历了一些“陷阱”,所以我   认为值得记录。

感谢您的回答。我只是试图找出是否有一些更简单的方法,然后做我知道我不得不做的事情。我决定使用服务器端写入。

我正在使用苹果酒,栗子和brepl服务器与chrome客户端连接。由于我不熟悉环形服务器,组件和嵌入式jetty服务器,因此我不知道如何向brepl服务器(端口10555)添加Web服务。相反,我在我的本地apache服务器上添加了一个。

因为请求来自jetty服务器的apache(而不是浏览器),我得到了“跨域资源共享”问题,即消息:

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

每当我向服务的网址提交请求时。

我能够通过将以下内容添加到我的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.core作为我的客户端api:

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

并将服务称为:

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

答案 2 :(得分: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);
相关问题