`
凉粉仔
  • 浏览: 40686 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

v8cgi使用笔记

阅读更多

想象过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;","CLIENTNAME":"Console","CommonPro
gramFiles":"C:\\Program Files\\Common Files","COMPUTERNAME":"PC-200906290725","C
omSpec":"C:\\WINDOWS\\system32\\cmd.exe","FP_NO_HOST_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-200906290725","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":"x86 Family 6 Model 23 Stepping
10, GenuineIntel","PROCESSOR_LEVEL":"6","PROCESSOR_REVISION":"170a","ProgramFile
s":"C:\\Program Files","PROMPT":"$P$G","SESSIONNAME":"Console","SystemDrive":"C:
","SystemRoot":"C:\\WINDOWS","TEMP":"C:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp","TM
P":"C:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp","USERDOMAIN":"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.v8cgiMySQL, {
 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.iteye.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

<VirtualHost *:80>
 ServerAdmin yanglefeng@xunlei.com
 ServerName v8.xunlei.com
 DocumentRoot "D:/v8cgi-0.8.2-win32/www"
 <Directory D:/v8cgi-0.8.2-win32/www>
  Options FollowSymLinks
  AllowOverride all
 </Directory>
 ErrorLog "logs/v8cgi-error_log"
</VirtualHost>

 由于在这里配置的域名为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('<h1>Source to this page</h1>');
println(Jst.executeParsed(parsed, { name: 'flintstone' }));

 //模板文件test.tpl

<table cellspacing="0" cellpadding="4">
<% for(var i = 0; i < 10; i++){ %><!-- 循环输出 -->
  <tr>
    <td style="background-color: <%= i % 2 == 0 ? 'red' : 'gold' %>">
        Hi, <%=name%>! i is <%= i %>
    </td>
  </tr>
<% } %>
</table>
<% name = 'rubble'; %><!-- 直接输出 -->
<%=name%>

 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/

分享到:
评论

相关推荐

    Python-V8Py使用V8引擎从JavaScript中调用PythonAPI

    要使用V8Py,首先需要确保你的系统上已经安装了V8引擎和Python的C++构建工具。你可以通过以下命令安装V8Py: ```bash pip install v8py ``` **创建Python API供JavaScript调用** 在Python中,我们可以定义一个函数...

    Google V8学习笔记

    里面介绍了如何使用google v8,并且附带了详细的例子讲解,很直观,对学习v8的童靴很有帮助

    v8使用简解 完整源码

    2. **垃圾回收(Garbage Collection)**:V8使用了先进的垃圾回收机制,如分代垃圾回收、标记-清除算法、压缩算法等,确保内存的有效管理和释放。V8还引入了增量垃圾回收,避免一次性占用大量CPU时间,影响应用性能...

    V8Android,在android上使用v8 javascript引擎.zip

    7. **内存管理和线程安全**:在Android环境中使用V8,需要考虑内存管理和线程安全问题。V8引擎本身是多线程安全的,但开发者需要确保在正确的线程上执行JavaScript代码,并妥善管理V8上下文。 8. **性能优化**:...

    易语言使用v8引擎(基于UseDotNet)

    易语言使用v8引擎(基于UseDotNet)。v8.e 中的 V8Engine类 与 Handle类 是由 类库查看器生成的代码。v8.net 介绍 。http://blog.csdn.net/david136796/article/details/49660735。@为你芯冻。

    delphi 调用google v8 引擎 最新版本

    要在Delphi中使用V8引擎,我们需要一个能够与V8交互的接口或者绑定库。这个"delphi调用v8引擎"的源码应该包含了这样的接口实现,使得Delphi程序能够创建V8上下文,执行JavaScript代码,并获取执行结果。通常,这样的...

    Microstation-V8中文帮助手册

    这款中文帮助手册详细介绍了MicroStation V8的各项功能和操作流程,旨在帮助用户熟练掌握该软件的使用技巧。 1. **用户界面**:MicroStation V8的用户界面包括工作区、菜单栏、工具栏、绘图窗口和状态栏等部分。...

    Dahua大华智能锁(乐橙 V8系列)使用说明书.pdf

    Dahua大华智能锁(乐橙 V8系列)使用说明书.pdf

    Google V8学习手记,月javascript写服务器端是多少人的梦醒呀,Google v8让javascript和php一样

    除了浏览器中的应用之外,V8 还能够被嵌入到任何 C++ 应用程序中,使得开发者可以在 C++ 程序中直接使用 JavaScript 来编写业务逻辑,极大地提高了开发灵活性。 V8 的主要功能包括: - **高性能的 JavaScript 解析...

    配套“编译v8引擎”文章使用

    Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript进行服务器端编程。Node.js利用V8的高性能特性,实现了非阻塞I/O和事件驱动的模型,这使得Node.js非常适合处理大量的并发连接,常...

    V8调用例子 易语言

    本教程主要介绍如何使用易语言来调用V8引擎,实现JavaScript代码在易语言程序中的执行。 首先,理解V8引擎的工作原理至关重要。V8引擎采用了即时编译(JIT)技术,将JavaScript源代码编译为机器码,从而提高了运行...

    配套“编译v8引擎”文章使用 python26

    本文将深入探讨如何使用Python2.6来配合编译V8引擎,以便更好地理解其工作原理和优化JavaScript执行性能。 一、V8引擎简介 V8引擎以其高效的即时编译(JIT)技术闻名,它将JavaScript代码直接编译成机器码,从而...

    delphi调用v8引擎.zip

    2. **内存管理**:V8引擎使用了自己的垃圾回收机制,因此在Delphi中使用V8时,必须遵循V8的内存管理规则,确保在适当的时候释放资源,避免内存泄漏。 3. **异常处理**:JavaScript代码可能会抛出异常,V8提供了处理...

    VS2010编译V8 JavaScript引擎库可嵌入C++

    本文将深入探讨如何使用Visual Studio 2010(VS2010)来编译V8引擎,并将其嵌入到C++项目中。同时,我们还将介绍一个名为"TestJS"的Demo代码,帮助你更好地理解和应用编译后的V8库。 首先,编译V8引擎需要以下几个...

    c# asp.net 在后台使用谷歌V8引擎执行js

    c# 、asp.net 在后台使用谷歌V8引擎执行js,将示例工程中的GoogleV8Engine.cs文件复制到你的项目中。将GoogleV8Engine_x64.dll 和 GoogleV8Engine_x86.dll 两个非托管DLL文件拷贝到工程部署的DLL目录下(ASP.Net拷贝...

    配套“编译v8引擎”文章使用 cygwin

    V8引擎是Google开发的一款高性能JavaScript和WebAssembly的开源虚拟机,主要用于Chrome浏览器以及Node.js后端环境中。本文将详细讲解如何在Windows操作系统上利用Cygwin环境来编译V8引擎。 首先,Cygwin是一款模拟...

    Google V8引擎LIB库-谷歌Chrome JavaScript引擎

    要在C++项目中使用Google V8,开发者需要包含对应的库文件,并使用提供的API来创建V8环境、上下文、对象、函数等,然后执行JavaScript代码。V8 提供了丰富的API,如`Isolate`(隔离区)、`Context`(上下文)、`...

Global site tag (gtag.js) - Google Analytics