当前位置: 代码迷 >> CGI >> v8cgi运用笔记
  详细解决方案

v8cgi运用笔记

热度:501   发布时间:2012-08-02 11:35:26.0
v8cgi使用笔记

v8cgi使用笔记
2010年11月01日
  想象过JAVASCRIPT能做服务器端语言吗?
  请注意,这里说的跟.net所谓的服务器端JS没有什么联系,我说的是用JS语言来写cgi脚本。
  这就是今天要介绍的开源脚本工具V8CGI。
  注:V8开源项目貌似分为V8和V8CGI两个子项目。今天我只是简单地试用了win32版本的V8CGI工具,并没有深入研究,希望大家能指出我的错误之处。
  V8CGI有linux版和win32两种版本,由于我的本本没有安装linux环境,因此使用win32版本进行试用。
  【环境】
  WindowsXP
  V8CGI 0.8.2
  服务器使用wamp5傻瓜包
  【一、安装】
  将V8CGI解压。
  例如我们将其解压到D:\v8cgi-0.8.2-win32目录,该目录下有v8cgi.conf文件,将其copy到c:\v8cgi.conf,然后编辑其内容,一般只需要将 require.paths.push("c:/program files/v8cgi/lib");
  这句里面的路径改为 require.paths.push("D:/v8cgi-0.8.2-win32/lib");
  Config["libraryAutoload"] = ["js", "util", "html", "http"];
  这句表示自动加载的库,如果是web应用的话,最好加上requestHandler这个库。
  即可。然后将D:\v8cgi-0.8.2-win32目录加入环境变量path中去。
  【二、命令行试用】
  [实例1].helloworld
  //[helloworld.js] system.stdout("hello world"); 
  将以上代码编辑然后保存为helloworld.js,打开CMD命令行工具,然后输入 v8cgi helloworld.js
  即可看到结果
  D:\v8cgi-0.8.2-win32\example>v8cgi helloworld.js
  hello world
  注意,文件参数必须是完整路径,否则会提示
  Cannot find module 'helloworld.js'
  [代码解释]
  system.stdout(str) 标准输出
  [实例2].输出环境变量
  //example.js system.stdout(JSON.stringify(system.env) + "\n"); 
  同例1,保存为example.js然后在命令行中运行。 D:\v8cgi-0.8.2-win32\example>v8cgi example.js {"ALLUSERSPROFILE":"C:\\Documents and Settings\\All Users","APPDATA":"C:\\Docume nts and Settings\\Administrator\\Application Data","classpath":"D:\\java\\lib;D: \\java\\lib\\dt.jar;D:\\java\\lib\\tools.jar;","CL IENTNAME":"Console","CommonPro gramFiles":"C:\\Program Files\\Common Files","COMPUTERNAME":"PC-200906290725","C omSpec":"C:\\WINDOWS\\system32\\cmd.exe","FP_NO_HO ST_CHECK":"NO","HOMEDRIVE":"C: ","HOMEPATH":"\\Documents and Settings\\Administrator","JAVA_HOME":"D:\\java;"," JPDR":"D:\\JeCat_PHP\\php-win.exe","JPDR_CL":"D:\\ JeCat_PHP\\php.exe","JPDR_ROOT ":"D:\\JeCat_PHP\\","LOGONSERVER":"\\\\PC-20090629 0725","NUMBER_OF_PROCESSORS":" 2","OS":"Windows_NT","Path":"C:\\WINDOWS\\system32 ;C:\\WINDOWS;C:\\WINDOWS\\Syst em32\\Wbem;D:\\Program Files\\TortoiseSVN\\bin;C:\\Program Files\\Common Files\\ Thunder Network\\KanKan\\Codecs;C:\\Program Files\\Microsoft SQL Server\\90\\Too ls\\binn\\;D:\\wamp\\php;D:\\java\\bin;D:\\v8cgi-0 .8.2-win32;","PATHEXT":".COM;. EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH","PDR": "\"D:\\JeCat_PHP\\php-win.exe\ "","PDR_CL":"\"D:\\JeCat_PHP\\php.exe\"","PDR_ROOT ":"\"D:\\JeCat_PHP\\\"","PROCE SSOR_ARCHITECTURE":"x86","PROCESSOR_IDENTIFIER":"x 86 Family 6 Model 23 Stepping 10, GenuineIntel","PROCESSOR_LEVEL":"6","PROCESSOR_REV ISION":"170a","ProgramFile s":"C:\\Program Files","PROMPT":"$P$G","SESSIONNAME":"Console","Sy stemDrive":"C: ","SystemRoot":"C:\\WINDOWS","TEMP":"C:\\DOCUME~1\ \ADMINI~1\\LOCALS~1\\Temp","TM P":"C:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp","USERD OMAIN":"PC-200906290725","USER NAME":"Administrator","USERPROFILE":"C:\\Documents and Settings\\Administrator", "VS80COMNTOOLS":"D:\\Program Files\\Microsoft Visual Studio 8\\Common7\\Tools\\" ,"windir":"C:\\WINDOWS"} 
  [代码解释]
  system.env 环境变量
  JSON.stringify 将数组转化为一个json字符串
  [实例3].用v8cgi编写一个服务
  //[server.js] var Socket = require("socket").Socket; var address = "127.0.0.1"; var port = 10001; var socket = new Socket(Socket.PF_INET, Socket.SOCK_STREAM, Socket.IPPROTO_TCP); socket.setOption(Socket.SO_REUSEADDR, true); socket.bind(address, port); socket.listen(10); while (1) { var connection = socket.accept(); var data = "", buffer = ""; while (1) { buffer = connection.receive(1000); if (!buffer) { break; } data += buffer; if (data.indexOf("\n\n") == data.length-2) { break; } if (data.indexOf("\r\n\r\n") == data.length-4) { break; } } connection.send("HTTP/1.0 200 OK\n\nHello world .)"); connection.close(); if (data.match(/quit/i)) { break; } } socket.close(); 
  保存后在命令行执行。
  然后我们可以在浏览器中访问http://127.0.0.1:10001/可以看到浏览器中显示一句
  Hello world .)
  [代码解释]
  第一行,创建一个socket对象。
  2~7行,将服务绑定到127.0.0.1:10001
  剩余代码,是关于输出内容的。
  [实例4].操作mysql数据库
  //[active_record.js] var ActiveRecord = require('active_record').ActiveRecord; ActiveRecord.connect(ActiveRecord.Adapters.v8cgiMy SQL, { user: 'root', pass: '', name: 'testdb' }); var User = ActiveRecord.create('users',{ username: '', password: '', post_count: 0, profile: { type: 'TEXT', value: '' } },{ getProfileWordCount: function(){ return this.get('profile').split(/\s+/).length; } }); //插入一条数据 var jessica = User.create({ username: 'Yanglefeng', password: 'scut', post_count: 50, profile: 'hey! how are you?!' }); //查找一条数据 var jessica = User.findByUsername('Jessica'); system.stdout(jessica.password); 
  [代码解释]
  运行前,请建立一个测试数据库testdb,并建立一个表 CREATE TABLE `users` ( `username` varchar(80) NOT NULL, `password` varchar(80) NOT NULL, `post_count` varchar(80) NOT NULL, `profile` text NOT NULL ) 
  第1行,创建一个active_record对象。
  3~7行,连接数据库。
  9~21行,定义DB模型。
  24~29行,插入一条数据。
  32~33行,查找数据。
  除了mysql外,V8CGI还支持pgsql和sqlite数据库。
  [实例4].显示全局变量和对象
  //v8cgi-infos.jst response.write( HTML.dump(global) ); 
  说明,我尝试在命令行运行该脚本时,出现错误:
  D:\v8cgi-0.8.2-win32\example\v8cgi-infos.js:8: ReferenceError: response is not d
  efinedefined
  该脚本只能在web模式下才能正确运行,详情请看第三章。
  [实例5].捉取网页 //wwwclient.jst var client = new HTTP.ClientRequest("http://www.javaeye.com/"); var response = client.send(true); system.stdout(JSON.stringify(response._headers, false, " ")); system.stdout("\n\n"); system.stdout(response.data); 
  该脚本只能在web模式下才能正确运行,详情请看第三章。
  [实例6].命令行JS
  //shell.js while (1) { system.stdout("> "); var cmd = ""; var ch = ""; while (1) { ch = system.stdin(1); if (ch == "\n") { break; } else { cmd += ch; } } if (cmd == "quit" || cmd == "exit" || cmd == "bye") { break; } var error = false; try { var result = eval(cmd); } catch(e) { error = true; system.stdout(e+"\n"); } finally { if (!error && typeof(result) != "undefined") { system.stdout(result+"\n"); } } } 
  执行该脚本后,就可以以命令行方式执行JS代码了。
  【三、在apache中使用】
  V8CGI除了CGI模式外,还支持FastCGI,能够很好地与apache、nginx等服务器结合。
  1.配置apache解析
  添加
  LoadModule v8cgi_module "d:/v8cgi-0.8.2-win32/mod_v8cgi.dll"
  以及
  AddHandler v8cgi-script .sjs .ssjs .jst
  前者是加载V8解析器模块,后者是绑定脚本后缀。
  2.配置vhost  ServerAdmin yanglefeng@xunlei.com ServerName v8.xunlei.com DocumentRoot "D:/v8cgi-0.8.2-win32/www"  Options FollowSymLinks AllowOverride all  ErrorLog "logs/v8cgi-error_log"  
  由于在这里配置的域名为v8.xunlei.com,为了能在本地访问,需要配置HOSTS:
  C:\WINDOWS\system32\drivers\etc\HOSTS
  127.0.0.1 v8.xunlei.com
  配置完成后,重启apache生效。下面我们测试一些实例。(注:以下文件必须保存到D:/v8cgi-0.8.2-win32/www)
  [实例1].加载模板
  //主程序testjst.sjs include("requestHandler"); var tpl = file_get_contents('test.tpl'); var parsed = Jst.parse(tpl); println('Source to this page'); println(Jst.executeParsed(parsed, { name: 'flintstone' })); 
  //模板文件test.tpl    "> Hi, ! i is        
  V8CGI在WEB应用时,一般都需要先将requestHandler这个类include进来。
  为了不用每次都写这句代码,我们可以修改c:\v8cgi.conf,增加:
  Config["libraryAutoload"] = ["js", "util", "html", "http", "requestHandler"];
  访问http://v8.xunlei.com/testjst.sjs上面程序的运行结果是: Hi, flintstone! i is 0 Hi, flintstone! i is 1 Hi, flintstone! i is 2 Hi, flintstone! i is 3 Hi, flintstone! i is 4 Hi, flintstone! i is 5 Hi, flintstone! i is 6 Hi, flintstone! i is 7 Hi, flintstone! i is 8 Hi, flintstone! i is 9 
  每行背景色黄红相间。
  [实例2].错误
  可以尝试写一些简单的错误看看,例如
  xxx
  保存为errortest.sjs
  访问http://v8.xunlei.com/errortest.sjs,网页显示出来的结果为:
  D:\v8cgi-0.8.2-win32\www\errortest.sjs:5: ReferenceError: xxx is not defined
  然后再尝试一个高级点的错误实例: function foo() { bar(); } function bar() { baz(); // undefined } foo(); 
  保存为errortest2.sjs
  访问http://v8.xunlei.com/errortest2.sjs,网页显示出来的结果为:
  D:\v8cgi-0.8.2-win32\www\errortest2.sjs:10: ReferenceError: baz is not defined
  从上面例子可以看出,V8CGI执行JS的方式跟普通的JS解析一样,以解析方式执行,当遇到未定义的变量或函数时就会抛出错误。跟编译型的语言并不一样。
  【四、其他】
  V8CGI的WIN32版本还包含了gd库的dll,但是由于附带的example中并没有实例介绍,因此没有尝试。
  除了mysql外,V8CGI还附带了pgsql.dll,sqlite.dll两个数据库插件,不过我没有用过这两种数据库,因此也没有试用。
  v8cgi自带的例子example\mykesx中有一些比较有用的扩展函数,例如Util.js里面有md5函数以及ubbcode翻译器。
  限于篇幅,这里不作介绍,有兴趣的童鞋自己研究吧。
  v8cgi自带的例子example\OpenGL貌似是客户端版本的程序,V8CGI居然还可以做客户端吖,NB大了。可是我的机器没有安装OpenGL,也不懂这方面的开发,运行第一句include("GL")就抛错了。如果有哪位童鞋运行成功了,麻烦教下我如何安装OpenGL并运行其两个例子?
  【五、试用总结】
  感觉V8CGI挺像python和php的。
  不过其库类还很少,要想成为一种主流服务器端开发语言的话,很多方面还有待提高。
  不过其开发者也说了,这个产品只是一个尝试,是一个实验性的产品。期待外国友人们将其继续完善。
  我的邮箱yanglefeng@xunlei.com
  QQ:20001345
  【附录】
  V8CGI svn下载地址:
  http://v8cgi.googlecode.com/svn/trunk/
  相关解决方案