在eval中编译coffeescript

时间:2014-04-20 06:07:46

标签: javascript coffeescript eval

我有一个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正文或其他方式传递。

1 个答案:

答案 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界面并没有详细记录,因此您可能需要阅读源代码并进行实验,以了解您拥有的选项类型以及您自己处理的错误处理方式。

这种事情可能不是你曾经有过的最好的想法,但你似乎已经知道了。