【问题标题】:Compile coffeescript in eval在 eval 中编译咖啡脚本
【发布时间】:2014-06-04 10:26:23
【问题描述】:

我有一个 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 代码根本 .因此,我需要在咖啡脚本周围包装一些东西,以便在评估时将其转换为 javascript,编译和执行生成的 javascript完全在 eval 内。

这可能吗?

澄清:我根本不希望coffeescript 编译器的源代码存在于我的Web 服务器的磁盘上。 (例如 extras/coffee-script.js)我想将 coffeescript 编译器的源代码传递给 eval 块,所以编译本身是在没有任何依赖关系的情况下完成的。然后我想执行生成的 javascript。

coffeescript 编译器可能不适合查询参数,因此从概念上讲,它可以通过 POST 正文或其他方式传递。

【问题讨论】:

    标签: javascript coffeescript eval


    【解决方案1】:

    来自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 接口的文档并没有那么完善,因此您可能需要阅读源代码并进行实验,以了解您有哪些选项以及您要进行哪些错误处理。

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

    【讨论】:

    • 感谢您的回答。我更新了我的问题,以明确我想要做什么。您的回答很有帮助,只是没有让我完全了解。
    • 所以你想evalCoffeeScript 但你不想在任何地方使用CoffeeScript 编译器?
    • 我想将coffeescript编译器源代码传递到eval语句中。抱歉,如果最初不清楚。你的回答对我还是很有帮助的。
    • 当然你可以这样做,但这很麻烦,也很昂贵,而且你必须将传入的 CoffeeScript 包装在对编译器的调用中。
    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 2012-01-25
    • 2012-07-23
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2013-06-26
    相关资源
    最近更新 更多