zoukankan      html  css  js  c++  java
  • Node.js下的Hello World

    Node.js技术现在可谓是如火如荼,前后端都统一为Javascript的体验绝对是受到了很多人的青睐,我都后悔以前没抽时间好好学一学Javascript了。 首先,我来介绍一下Node.js。本人实在是才疏学浅,对技术的认识不够,所以就借鉴了血多InfoQ上的好文,后面会给出链接。 Node.js采用C++语言编写而成,是一个Javascript的运行环境。重点就在这个运行环境四个字上。意思就是,你编写好的Js后端服务器代码,要通过Node来运行。拿Windows下来说,比如你要运行hello.js的后台代码,可以如下:
    D:Nodejs>node hello.js
    如果你代码没有错误的话,你就成功的运行了这个服务器。 关于Node.js的优势与特色,大家大可去google下,有很多前辈的文章都说明的非常清楚,总而言之,Node.js采用事件驱动、异步编程,为网络服务而设计,始终保持单线程,通过事件轮询,来实现并行操作。 下面,我为大家介绍一个简单的Node.js示例。我自己也是学习的Node.js入门,这真的是针对初学者的教程,如果想亲自实践下Node.js的同学,完全可以忽视下面的内容,直接跳到该教程实践。 下面说一下我的文件结构:
    • index.js          //入口文件,包含了对应url和调用方法的字典
    • server.js       //服务端启动文件
    • router.js        //路由文件,包含了路由的解析
    • requestHandler.js    //请求处理文件,包含了请求处理的逻辑
    来看下代码吧>.<
    //index.js
    var server = require("./server");
    var route = require("./router");
    var requestHandlers = require("./requestHandlers");
    
    var handle = {};
    handle["/"] = requestHandlers.start;
    handle["/start"] = requestHandlers.start;
    handle["/upload"] = requestHandlers.upload;
    
    server.start(route.route, handle);
    稍微解释下,前面3个require语句,代表了使用对应的3个模块,而且这三个模块是我自己定义的,取得模块后就能方便的调用其中的方法了。随后定义了handle字典,其中的key代表着可以识别的url中的path,value表示应用分发到的处理逻辑。最后一行的server.start()表示启动服务,至于参数的含义就移步到server.js中就明白了。
    //server.js
    var http = require("http");
    var url = require("url");
    
    function start(route, handle){
    	function onRequest(request, response){
    		console.log("Reqeust received");
    		var pathname = url.parse(request.url).pathname;
    		console.log("Reqeust for " + pathname + " received");
    
    		//route(handle, pathname, response);
    		request.setEncoding("utf-8");
    		var postData = '';
    		request.addListener("data", function(postDataChunk) {
    			postData += postDataChunk;
    			console.log("Received Post Data chunk '"+postDataChunk+"'.");
    		});
    
    		request.addListener("end", function() {
    			route(handle, pathname, response, postData);
    		});
    	}
    
    	http.createServer(onRequest).listen(8888);
    	console.log("Server has Started");
    }
    
    exports.start = start ;
    同样解释下,首先是包含进两个系统内置的包,这两个也是Node.js应用最最基本的包了,一个负责http的相关事务,一个负责url的内容。之后的start方法,仅仅是做了一层封装,最核心的逻辑还是在onRequest方法之中。console.log()都只是为了在控制台输出,方便理清运行逻辑,对功能没有影响,可以无视掉。pathname变量就是通过url得到请求的path路径。addListener方法是添加监听器,当请求是post方法包含数据时,监听器就会监听到,并回调参数中传递的方法。都很好理解,data事件是收集传过来的数据,end事件是把请求和数据一起分发到route那边去。然后http.createServer(onRequest).listen(8888);这一段是告诉服务器,每当有请求过来时就传给onRequest方法,同时是监听本地的8888端口。最后的exports.start 是打包操作,大家可以从index.js中略知一二。
    //router.js
    function route(handle, pathname, response, postData){
    	console.log("About to route a request for "+ pathname);
    	if(typeof handle[pathname] === 'function'){
    		return handle[pathname](response, postData);
    	}else{
    		console.log("No request handler found for "+ pathname);
    		response.writeHead(404, {"Content-type": "text/plain"});
    		response.write("404 Not found");
    		response.end();
    	}
    }
    
    exports.route = route;
    来解释下router.js这个文件。很简单,只包含了一个route的处理逻辑。我们来看一下参数,handle是从index.js中传过来的请求处理字典,pathname是从server.js中传过来的路径,response同样是server传来的响应,你的服务器要做什么样的应答,都在response中了,最后的postData就是post请求中的数据,也是从server那边传过来。再来看下具体逻辑,实现判断请求路径是否在字典中,在并且能找到处理方法,那么直接返回调用这个方法,并把response和postData传过去;如果找不到,表示不支持这个请求,返回字符串Not found。writeHead方法是写入响应的首部,很简单。最后同样是把route这个方法打包出去。
    // requestHandlers.js
    var querystring = require("querystring");
    
    function start(response, postData){
    	console.log("Request handler 'start' was called");
    
    	var body = '<html>'+
        '<head>'+
        '<meta http-equiv="Content-Type" content="text/html; '+
        'charset=UTF-8" />'+
        '</head>'+
        '<body>'+
        '<form action="/upload" method="post">'+
        '<textarea name="text" rows="20" cols="60"></textarea>'+
        '<input type="submit" value="Submit text" />'+
        '</form>'+
        '</body>'+
        '</html>';
    
        response.writeHead(200, {"Content-Type": "text/html"});
        response.write(body);
        response.end();
    }
    
    function upload(response, postData){
    	console.log("Request handler 'upload' was called.");
    	response.writeHead(200, {"Content-Type": "text/plain"});
      	response.write("You've sent: " + querystring.parse(postData).text);
      	response.end();
    }
    
    exports.start = start;
    exports.upload = upload;
    来看下最后一个文件,requestHandlers.js。这个文件主要负责每个请求的详细处理逻辑了,首先引用进来的是一个内置的包,可以处理get或则post请求中的数据,顾名思义嘛,querystring。第一个方法是start方法,是改Node应用的默认方法,很简单,直接在response中写入一段html代码,记得别忘记调用response.end方法,表示响应到此结束。 第二个upload方法,是将从start界面中输入的字符串展示出来,也非常简单。因为数据postData处理在server.js中就已经进行过了,这里只是一个简单的拼接,并直接输出到页面之中。这里可以稍微注意下querystring包的用法,parse是分析这段数据,得到一个对象。注意到之前的textarea的命名是text,所以在这取text属性,就能得到传过来的数据了。 到此,整个代码就展示的差不多了,然后只用转到对应文件目录下的控制台,输入node index.js 回车,就能看到服务器成功运行了,前提是代码是正确的。 打开浏览器,输入localhost:8888,就能看到自己的start界面了,输入一段文本submit,跳到upload页面,也很成功的展示了该段文本。一个简单的helloworld就这样ok了,要在这之上添加功能也是非常容易的。不过最好是研究下是MVC的实践,这样才能让人舒心啊。再次强调感谢下Node入门这本教程。这之中提到了许多好的文章,我来总结下: 马上就要进行实习生考核了,好忧桑,实习的时间过得好快啊,不舍的感觉很浓厚啊。
  • 相关阅读:
    Window 窗口类
    使用 Bolt 实现 GridView 表格控件
    lua的table库
    Windows编程总结之 DLL
    lua 打印 table 拷贝table
    使用 xlue 实现简单 listbox 控件
    使用 xlue 实现 tips
    extern “C”
    COleVariant如何转换为int double string cstring
    原来WIN32 API也有GetOpenFileName函数
  • 原文地址:https://www.cnblogs.com/No-body/p/4207258.html
Copyright © 2011-2022 走看看