Node.js

http://www.nodebeginner.org/index-zh-cn.html

服务器端JavaScript
要实现在后台运行JavaScript代码,代码需要先被解释然后正确的执行,这是Node.js的原理,它使用Google的V8虚拟机来解释和执行JavaScript代码,此外,Node.js还有许多有用的模块,它们可以简化很多重复的劳作,比如向终端输出字符串。
因此,Node.js事实上既是一个运行时环境,同时又是一个库
应用目标:
(1)用户可以通过浏览器使用我们的应用。
(2)当用户请求http://domain/start时,可以看到一个欢迎页面,页面上有一个文件上传的表单。
(3)用户可以选择一个图片并提交表单,随后文件将被上传到http://domain/upload,该页面完成上传后会把图片显示
应用模块:
1)需要提供Web页面,因此需要一个HTTP服务器
2)对于不同的请求,根据请求的URL,我们的服务器需要给予不同的响应,因此我们需要一个路由,用于把请求对应到请求处理程序(request handler)
3)当请求被服务器接收并通过路由传递之后,需要可以对其进行处理,因此我们需要最终的请求处理程序
4)路由还应该能处理POST数据,并且把数据封装成更友好的格式传递给请求处理入程序,因此需要请求数据处理功能
5)我们不仅仅要处理URL对应的请求,还要把内容显示出来,这意味着我们需要一些视图逻辑供请求处理程序使用,以便将内容发送给用户的浏览器
6)最后,用户需要上传图片,所以我们需要上传处理功能来处理这方面的细节
1.var http = require("http"); //请求Node.js自带的http模块,并赋值给变量http
http.createServer(function(request, response) {
        console.log("Request received");
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.write("Hello World");
        response.end();
}).listen(8888);
/*调用http模块提供的函数:createServer,这个函数会返回一个对象,该对象有一个listen方法,此方法有一个数值参数指定这个HTTP服务器监听的端口号
当回调启动,匿名函数被触发的时候,有两个参数被传入:request和response,它们是对象,可以使用它们的方法来处理HTTP请求的细节,并且响应请求(比如向发出请求的浏览器发回一些东西),具体的处理是:当收到请求时,使用response.writeHead()函数发送一个HTTP状态200和HTTP头的内容类型(content-type),使用response.write()函数在HTTP相应主体中发送文本“Hello Wrold”,最后调用response.end()完成响应。目前并没使用request对象。*/
console.log("Server has started");

把服务器脚本放到一个叫做start的函数里,然后导出这个函数
var http = require("http");

function start() {
    function onRequest(request, response) {
        console.log("Request received.");
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.write("Hello World");
        response.end();
        }
    http.createServer(onRequest).listen(8888);
    console.log("Server has started.");
}
exports.start = start;
创建index.js文件并写入:
var server = require("./server");

server.start();
//可以像使用任何其他的内置模块一样使用server模块:请求这个文件并把它指向一个变量,其中已导出的函数就可以使用了

2.处理不同的HTTP请求,即路由模块,对应模块第三点
需要为路由提供请求的URL和其它需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码,因此需要查看HTTP请求,从中提取出请求的URL以及GET/POST参数。需要的所有数据都会包含在request对象中,该对象作为onRequest()回调函数的第一个参数传递,为了解析这些数据,需要额外的url和querystring Node.js模块

以非阻塞方式操作进行请求响应
Node.js的实现方案为 函数传递,到目前为止,我们的应用
已经可以通过应用各层间传递值的方式将请求处理程序返回的内容传递给HTTP服务器。相对将内容传递给服务器的方式,此处采用将服务器“传递”给内容的方式。就是将response对象(从服务器的回调函数onRequest()获取)通过请求路由传递给请求处理程序。随后,处理程序就可以采用该对象上的函数来对请求作出响应。

为应用添加实际用途:
用户选择一个文件,上传给文件,然后在浏览器中看到上传的文件。
实现此功能分为如下两步:1.处理post请求,2使用node.js的一个用于文件上传的外部模块

安装外部Node.js模块并应用到应用中
Node.js有自己的包管理器,叫NPM,通过命令
npm install formidable 安装模块
将文件读取到服务器中,使用fs模块