我有一个node.js网站,我在查询字符串中传递了javascript。
然后我在请求处理程序中评估javascript。 (不安全,我知道。)
// web.js
var express = require("express");
var logfmt = require("logfmt");
var app = express();
app.use(logfmt.requestLogger());
app.get('/', function(req, res) {
var code = req.query.code;
var result = eval("(function(req, res) {" + code + "})(req, res);");
res.send('Result: ' + result);
});
var port = process.env.PORT || 5000;
app.listen(port, function() {
console.log("Listening on " + port);
});
我希望能够将coffeescript传递给查询字符串并对其进行评估,但我不想更改node.js代码 。因此,我需要在coffeescript周围包装一些内容,以便在eval时间将其转换为javascript,对结果javascript 的编译和执行完全在eval中。
这可能吗?
澄清:我不希望coffeescript编译器的源根本存在于我的Web服务器上的磁盘上。 (例如extras / coffee-script.js)我想将coffeescript编译器的源代码传递给 eval块,因此编译本身没有任何依赖性。然后我想执行生成的javascript。
coffeescript编译器可能不适合查询参数,因此从概念上讲它可以通过POST正文或其他方式传递。
答案 0 :(得分:4)
来自fine manual:
“text / coffeescript”脚本标记
虽然不建议严肃使用,但可以使用
<script type="text/coffeescript">
标记将CoffeeScripts直接包含在浏览器中。源包括编译器的压缩和缩小版本[...]extras/coffee-script.js
。在包含内联CoffeeScript标记的页面上包含此文件,它将按顺序编译和评估它们。[...]包含该脚本还可以访问
CoffeeScript.compile()
,这样您就可以弹出Firebug并尝试编译一些字符串。
这意味着您可以说:
js = CoffeeScript.compile('f = (x) -> x * x')
在js
中获取此JavaScript字符串:
(function() {
var f;
f = function(x) {
return x * x;
};
}).call(this);
然后您可以像其他任何JavaScript一样将js
提供给eval
。如果您不想使用通常的范围包装器,请包含bare: true
选项:
js = CoffeeScript.compile('f = (x) -> x * x', bare: true)
获取此解包的JavaScript:
var f;
f = function(x) {
return x * x;
};
当然,CoffeeScript.compile
界面并没有详细记录,因此您可能需要阅读源代码并进行实验,以了解您拥有的选项类型以及您自己处理的错误处理方式。
这种事情可能不是你曾经有过的最好的想法,但你似乎已经知道了。