2014-04-20 80 views
1

我有一個node.js網站,我在查詢字符串中傳遞了javascript。在eval中編譯coffeescript

然後我評估請求處理程序中的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的代碼在全部爲。因此,我需要圍繞咖啡文本打包,以便在eval時間將其轉換爲javascript,並在產生的javascript 中完成編譯和執行完全在eval內。

這可能嗎?

澄清:我不希望我的web服務器上的磁盤上存在coffeescript編譯器的來源。 (例如extras/coffee-script.js)我想將coffeescript編譯器的源代碼傳遞給eval塊的,所以編譯本身沒有任何依賴關係。然後我想執行結果的JavaScript。

coffeescript編譯器可能不適合查詢參數,所以概念上它可以通過POST主體或其他方式傳遞。

回答

4

fine manual

「文/ CoffeeScript的」 腳本標記

雖然它不建議使用嚴重,CoffeeScripts可以直接使用<script type="text/coffeescript">標籤瀏覽器中包括在內。源代碼包括一個壓縮和縮小版本的編譯器,如extras/coffee-script.js。將此文件包含在帶有inline CoffeeScript標籤的頁面中,並按順序編譯和評估它們。

[...]包括腳本也讓你訪問CoffeeScript.compile(),所以你可以彈出打開Firebug並嘗試編譯一些字符串。

這意味着,你可以說這樣的話:

js = CoffeeScript.compile('f = (x) -> x * x') 

獲取JavaScript的這串js

(function() { 
    var f; 
    f = function(x) { 
    return x * x; 
    }; 
}).call(this); 

,然後你可以喂jseval像任何其他JavaScript 。如果你不想平時範圍包裝,然後包括bare: true選項:

js = CoffeeScript.compile('f = (x) -> x * x', bare: true) 

得到這個展開的JavaScript:

var f; 
    f = function(x) { 
    return x * x; 
    }; 

當然,CoffeeScript.compile接口是不是有據可查,從而您可能需要閱讀源代碼並進行實驗,以瞭解您擁有哪些選項以及進行哪種錯誤處理。

這樣的事情可能不是你曾經擁有的最好主意,但你似乎已經知道了。

+0

感謝您的回答。我更新了我的問題,以澄清我正在嘗試做的事情。你的回答是有幫助的,只是沒有讓我一路走到那裏。 – funroll

+0

所以你想'eval' CoffeeScript,但你不想在任何地方使用CoffeeScript編譯器? –

+0

我想將coffeescript編譯器源代碼傳遞給eval語句。對不起,如果最初不清楚。你的回答對我仍然很有幫助。 – funroll