我正在运行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无关?
答案 0 :(得分:4)
从浏览器我认为你不能(比如JS),因为安全。
从nodejs检查nodejs doc:)
现在,如果你混合了一点闪光(yuk:| ...)那里有一个JS库(你可以在cljs中使用)。
答案 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);