2

按照这里的建议,我可以获得一个在 node.js 下运行并打印一些 hello world html 的 JavaScript 脚本:

test.cgi
-------
#!/usr/local/bin/node

console.log("Content-Type: text/html; charset=utf-8\n");
console.log("<html><body><h1>hello node.js world</h1></body></html>");
-------

并运行它:

$ ./test.cgi
Content-Type: text/html; charset=utf-8

<html><body><h1>hello node.js world</h1></body></html>

它还可以在 Apache 中按预期工作,并在浏览器中显示预期的 HTML。

现在转到 CoffeeScript(注意这里可爱的三重引号文档,Python 风格):

ctest.cgi
-------
#!/usr/bin/env coffee

console.log("Content-Type: text/html; charset=utf-8\n");
console.log('''<html><body><h1>hello CoffeeScript world
</h1></body></html>''');
-------

这在本地运行时有效:

$ ./ctest.cgi
Content-Type: text/html; charset=utf-8

<html><body><h1>hello CoffeeScript world
</h1></body></html>

但不是在 Apache 中:

Internal Server Error

为什么这不起作用?

4

5 回答 5

3

我试图通过从 CoffeeScript 逆向工程 command.js 并通过以下 JavaScript node.js shell 脚本直接运行我的咖啡脚本(上面的 ctest.cgi)来解决这个问题:

drip
-------
#!/usr/local/bin/node

var fs = require('fs');
var cs = require('/usr/local/lib/coffee-script/lib/coffee-script');
var args = process.argv;
var fname = args[2];
if (fname)
{
    fs.readFile(fname, function (err, data) {
      if (err) throw err;
      var text = data.toString(); //console.log(data.toString());
      cs.run(text, {'filename':fname, 'bare':undefined});
    });
}
-------

我把它放在 /usr/local/bin/drip 中,现在我可以运行 ctest.cgi,只需对顶行稍作改动:

#!/usr/bin/env /usr/local/bin/drip

现在我可以破解 CoffeeScript CGI 脚本并在浏览器中点击重新加载,而不必在更改 .coffee 文件时手动调用 CoffeeScript 编译器。

于 2011-03-13T04:41:10.467 回答
2

您可能已经想到了这一点,但是:您是否尝试过替换

#!/usr/bin/env coffee

绝对参考coffee位于何处?env依赖于PATH环境变量,PATH你的运行./ctest.cgi时间不一定和 Apache 的一样。

于 2011-03-13T15:38:04.777 回答
1

这是我的设置,任何有兴趣的人。

这对性能非常不利!

~/coffee
------
#!/usr/bin/perl 

# this is coffee runner!

print ` PATH="\$PATH:~/www/cgi-bin/bin" ; ~/www/cgi-bin/bin/node_modules/coffee-script/bin/coffee $ARGV[0] 2>&1 `;
------

我没有必要改变我的服务器环境,所以我可以在这里添加我的节点路径。但是,我可以在 .htaccess 中设置一个处理程序:

~/dir/.htaccess
------
AddHandler cgi-script .litcoffee
DirectoryIndex cv.litcoffee
------

这意味着我可以以 CGI 的形式运行 literate 并为浏览器提供咖啡 :-) 效率非常低,但无论如何都没有多少人访问我的网站。

然后我的每个脚本看起来像这样......

~/web/ascript.litcoffee
------
#!/usr/bin/perl /home/jimi/coffee

This is literate coffeescript!

    module.paths.push "/home/jimi/www/cgi-bin/bin/node_modules"
    require "coffee-script"

This is a wee module I wrote for spewing tags, with content and attributes

    global[k.toUpperCase()] = v for k,v of require './html.litcoffee'

It also provides a header function, but I'm going to move that to a CGI module when I get around to it.

    console.log CGI_HEADER()

Now we can put something to the browser.

    console.log HTML [
        HEAD [
            META {charset:"utf-8"}
            SCRIPT [],
                src : "https://raw.github.com/jashkenas/coffee-script/master/extras/coffee-script.js"
            SCRIPT [],
                src : "runsonclient.coffee"
                type    : "text/coffeescript"
            LINK
                rel : "stylesheet"
                href    : "mystyles.css"
            TITLE "A page title"
        ]
        BODY [
            H1 "a page title"
            INPUT 
                id     : "myinput"
                type   : "text"
            SVG
                id     : "mysvg"
                width  : "80%"
                height : "20"
            DIV
                id     : "mydiv"
        ]
    ]
------

我知道它不漂亮,但它有效。并且从脚本运行(尽管它不必是 perl!)允许 2>&1 所以我所有的错误都会出现在屏幕上,除非我的标题没有被打印出来......但是 Jared Updike 已经用 try 块解决了这个问题.

于 2013-11-08T02:11:57.737 回答
0

我不知道咖啡为什么会失败,但一个可能(而且非常简单)的解决方案是将您的代码放在一个单独的文件(test.coffee)中并执行要求:

#!/usr/local/bin/node

require('coffee-script')
require('./test')

(在需要咖啡脚本后,扩展会自动注册)

于 2011-03-14T04:36:32.923 回答
0

我试图更新我的答案,但它被拒绝了,并且有人建议将其添加为单独的答案......

我刚刚将其更新为带有 compile if 更新功能的 shell 脚本:

#!/bin/sh
CS=$1        # the coffeescript to be run
# the following works because (my) apache runs in the script's directory and passes just the filename (no path)
# if would be safer to test that this is the case, or make sure the dot is added to the filename part
JS=.$CS.cjs  # the compiled javascript
CE=.$CS.cerr # compiler errors
PATH="$PATH:/home/jimi/www/cgi-bin/bin:/home/jimi/www/cgi-bin/bin/node_modules/coffee-script/bin"
if [ ! -f $JS ] || [ $CS -nt $JS ] ; then
    coffee -c -p $1>$JS 2>$CE
fi
node $JS 2>&1   # runtime errors to browser
于 2016-10-25T10:53:34.987 回答