欢迎,来自IP地址为:60.168.24.16 的朋友
近些年来,网络应用开发出现了新的趋势,作为网络应用的开发人员,要时刻留意技术的演进。JavaScript语言是目前网络应用开发的发展方向,无疑也是网络开发中最为流行的实现技术。
基于JavaScript的web框架逐渐成为最为吸引人解决方案,能够显著提升开发效率,以最小的成本开发高安全性的网络应用。如果对网络应用有所关注,那么对于Node JavaScript(也就是Node.js或都简写为Node)多多少少都所耳闻。
本文将介绍如何在Linux系统中使用Node.js开发JavaSrcipt网络应用,在这之前,我们首先了解一下什么是Node.js.
什么是Node.js
Node.js是一种采用Chrome’s V8 JavaScript引擎开发的开源、轻量级高效的JavaScript实时运行环境。Node.js被设计成无线程模式(采用单线程),使用Python的网络引擎和Rubby的事件处理库。
事件驱动模型是Node.js的核心,作为Node.js的开发人员,要时刻了解会出现何种事件以及如何响应它们。
为什么Node.js很重要
Node.js十分强大也十分重要,主要有以下几种原因:
它使用异步事件驱动的非阻塞I/O执行模型,这提高了应用程序的吞吐量,并且支持真实Web应用程序的可伸缩性
它是单线程的,所以它在任一时刻只会使用一个CPU资源
每个Node.js应用都是一个完全意义上的web服务器,就像Apache或者Nginx一样
它使用child_process.fork() API来提供线程支持,用于创建子进程,并且提供集群模块
通过以上的介绍,你或许已经跃跃欲试想编写一个JavaScript应用了,但是首先需要搭建一个Node.js运行环境。其中包括Node.js以及NPM。搭建教程在>>这里<<
如何在Linux系统创建Node.js应用
Node.js一旦安装成功,就可以编写Java Script网络应用了。首先,需要创建一个存放应用文件的目录:
# mkdir -p /var/www/myapp
然后,进入这个新创建的目录,使用NPM工具我们的网络应用创建一个package.json文件,这个文件是一个关于此网络应用的小帮助文档,里面记录了应用名称、作者以及依赖文件等基本信息。
# cd /var/www/myapp
# npm init
在这一步中,系统会请求用户回答一些问题来完成”package.json”文件的内容,关于这些问题的详细解释如下:
package name – 应用名称
version – 应用版本
description – 应用的简短说明
entry point – 设置默认执行的文件,相当于HTML网站的默认页面
test command – 用于创建测试脚本 (默认为空)
git repository – 指定一个Git软件库,如果不需要则为空即可
keywords – 设置关键字,用于在npm中查找本应用
author – 应用作者
license – 设置本应用的许可
完整示例过程如下图所示:
如上图所示,我们设置了应用的默认执行文件为”index.js”,那么接下来就需要创建这个文件来启动应用。
创建”index.js”文件,并将如下内容添加至文件:
var http = require('http');
http.createServer(function(req,res){
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World!');
}).listen(8008);
console.log('Server started on localhost:8080; press Ctrl-C to terminate...!');
可以看到,文件使用的语言完全为Java Script,这对于开发网络应用来说极大的提升了便利性。
下面要做的就是使用如下命令测试Node.js服务器是否正常工作,可以启动我们添加的应用:
# node index.js
如果见到如下图所示信息,请表示应用已经成功启动:
现在要做的就是打开浏览器访问Node.js主机的8008端口,看是否会显示”Hello World!”信息。如果看到下图所示内容,就表示我们的web应用可以正常启动了。
我们之前的代码主要是使用HTTP模块来响应HTTP请求,而这个HTTP模块就是一个标准的Node.js内建模块。
Node.js HTTP模块
在Node.js中,模块与Java Script的类库十分类似,它们可以被我们的应用所引用来完成特定的功能。在Node.js应用中,我们既可以使用内建模块,又可以使用第三方模块,甚至可以使用自己创建的模块。
为了调用模块,可以使用”require”函数来完成:
var http = require('http');
一旦http模块被引入,它就可以完成创建服务器并侦听特定端口的功能(本例使用8008)。http.creatServer方法会以同用户相关的请求和响应作为参数来创建http服务器:
http.createServer(function(req,res){
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World!');
}).listen(8008);
这个createServer方法有两个参数,其中req表示用于接收客户端的请求,而res表示返回给客户端的响应结果。
代码的最后一句是用于向命令行终端回显信息,作为Node.js对服务器本身的输出内容:
console.log('Server started on localhost:8080; press Ctrl-C to terminate...!');
Node.js中的路由
路由在Node.js是一个十分重要的概念,这与网络技术中为数据包找寻到达目的地路径类似。Node.js中的路由是一种处理客户端请求的技术,用于将不同内容的请求用不同的URL地址区分开来。我们可以利用如下代码,来查看客户端请求的内容:
var http = require('http');
http.createServer(function(req,res){
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write(req.url);
res.end();
}).listen(8008);
console.log('Server started on localhost:8008; press Ctrl-C to terminate...!');
现在,我们通过浏览器访问不同的内容,例如如下例子:
http://192.168.235:8008
http://192.168.1.235:8008/about
http://192.168.1.235:8008/daehub/authors
现在,我们就可以根据不同的请求内容,响应不同的内容:
//include http module
var http = require('http');
http.createServer(function(req,res){
//store URL in variable q_string
var q_string = req.url;
switch(q_string) {
case '/':
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('Welcome To Daehub.com!')
res.end();
break;
case '/about':
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('About Us');
res.write('\n\n');
res.write('Daehub.com - The whizz center');
res.write('\n');
res.end('Find out more: https://www.daehub.com');
break;
case '/daehub/authors':
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('Daehub Authors');
res.write('\n\n');
res.end('Find all our authors here: https://www.daehub.com');
break;
default:
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('Not Found');
break;
}
}).listen(8008);
console.log('Server started on localhost:8008; press Ctrl-C to terminate....');
可以看到,Node.js可以根据不同的客户端请求,做出与之对应的响应了,这就是所谓的路由,看起来是不是很容易呢。