教你快速搭建Node.Js服务器的方法教程
前言
Node.js是一个事件驱动I/O服务端JavaScript环境,也可以理解为服务器端运行的JavaScript。JS作为一门编程语言,是运行在称为JS运行时的虚拟机中的,而在I/O功能上,JS更多依赖于宿主环境。一般我们遇到的宿主环境主要是浏览器,Node.js则是在服务器端运行的高速JavaScript解释器。
近期遇到一个小型网站需要建立一个简单的Web服务器,原本想用SpringMVC解决,无奈Spring的哲学博大精深,自己才疏学浅,不能快速出货,因此决定用Node.js试试,这里就简单介绍下如何快速启动一个简单易用的WebServer。这里我使用的开发环境是基于Ubuntu14.04的ElementaryOS。
1.准备工作
1.1安装NodeJS环境和npm模块管理器
sudoapt-getinstallnodejs sudoapt-getinstallnpm
npm是一个优秀的Node模块管理器,在开发中帮助我们解决很多第三方代码库的依赖管理事务。
1.2设置npm代理
假如没有提前做任何额外措施,那么必然当你使用npm从网络下载自己需要的NodeJs模块时,速度会非常慢,甚至会因超时而失败,具体原因不多讲,推荐使用淘宝的npm镜像,问题会得到解决。
- 打开~/.npmrc文件
- 输入registry=https://registry.npm.taobao.org
- 保存退出
注意如果你曾设置过全局穿墙但是npm依然速度很慢,可以试试在~/.npmrc文件中继续添加
- proxy=false
2.用ExpressGenerator搭建开发环境
Express是目前最流行的基于Node.js的Web开发框架,可以快速地搭建一个完整功能的网站。
ExpressGenerator是Express的应用程序生成器工具,使用它可以快速建立完整的项目文件目录。
2.1安装ExpressGenerator
$npminstallexpress-generator-g
2.2建立Express应用程序
express--view=pugNodeApp
这里view参数是用来预设开发中使用的模板引擎的。更多参数如下
express-h Usage:express[options][dir] Options: -h,--helpoutputusageinformation --versionoutputtheversionnumber -e,--ejsaddejsenginesupport --pugaddpugenginesupport --hbsaddhandlebarsenginesupport -H,--hoganaddhogan.jsenginesupport -v,--viewaddview support(ejs|hbs|hjs|jade|pug|twig|vash)(defaultstojade) -c,--css addstylesheet support(less|stylus|compass|sass)(defaultstoplaincss) --gitadd.gitignore -f,--forceforceonnon-emptydirectory
2.3解决模块依赖
进入刚刚建立的NodeApp文件夹,可以看到里面有一个package.json文件,它定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据),npm可以依据它来管理项目模块。
打开package.json可以看到里面的内容如下
{ "name":"NodeApp", "version":"0.0.0", "private":true, "scripts":{ "start":"node./bin/www" }, "dependencies":{ "body-parser":"~1.16.0", "cookie-parser":"~1.4.3", "debug":"~2.6.0", "express":"~4.14.1", "morgan":"~1.7.0", "pug":"~2.0.0-beta10", "serve-favicon":"~2.3.2" } }
现在在终端执行npm命令解决模块依赖,npm会按照package.json文件的内容下载相应模块,当然,如果没有设置穿墙措施这一步是无法执行的
npmintsall
3.初次启动服务器
基本上该有的配置和基本的逻辑代码ExpressGenerator都帮我们做好了,那么我们其实已经可以用一行命令启动服务器了。
执行以下命令
npmstart
访问localhost:3000即可看到Express欢迎页面了。
4.设置访问地址
可以看到在之前建立的文件目录下还有一个app.js文件,其实它就充当了一个项目中的main函数的角色,里面使用了很多Express中间件和Express语法,这里不一一叙述。
在实际生产环境中,我们需要自己设定外部访问端口,比如通过Http的80端口访问我们的服务器,那么就可以在app.js文件的"module.exports=app;"语句前加上如下代码
varserver=app.listen(80,"0.0.0.0",function(){ console.log("服务器IP地址:"+ip.address()); varhost=server.address().address; varport=server.address().port; console.log("应用已启动,访问地址为http://%s:%s",host,port) });
这里简单解释下,80意味着我们的服务器程序将监听本机的80端口,0.0.0.0意味着本地和外部访问请求都将由我们的服务器程序进行处理。
同时启动了服务器后我们在终端也可以看到当前主机的IP地址以及服务器程序接受的访问地址。
5.设置index页面内容
到这里为止,我们访问localhost地址会看到Express默认的欢迎页面,那么如何返回一个我们自己的页面呢。比如我们现在有一个index.html页面,我们需要在用户访问localhost时返回这个html页面,暂时不考虑静态文件的问题。
可以进入app.js文件,它现在应该长这样,
varexpress=require('express'); varpath=require('path'); varfavicon=require('serve-favicon'); varlogger=require('morgan'); varcookieParser=require('cookie-parser'); varbodyParser=require('body-parser'); varindex=require('./routes/index'); varusers=require('./routes/users'); varapp=express(); //viewenginesetup app.set('views',path.join(__dirname,'views')); app.set('viewengine','pug'); //uncommentafterplacingyourfaviconin/public //app.use(favicon(path.join(__dirname,'public','favicon.ico'))); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended:false})); app.use(cookieParser()); app.use(express.static(path.join(__dirname,'public'))); app.use('/',index); app.use('/users',users); //catch404andforwardtoerrorhandler app.use(function(req,res,next){ varerr=newError('NotFound'); err.status=404; next(err); }); //errorhandler app.use(function(err,req,res,next){ //setlocals,onlyprovidingerrorindevelopment res.locals.message=err.message; res.locals.error=req.app.get('env')==='development'?err:{}; //rendertheerrorpage res.status(err.status||500); res.render('error'); }); varserver=app.listen(80,"0.0.0.0",function(){ console.log("服务器IP地址:"+ip.address()); varhost=server.address().address; varport=server.address().port; console.log("应用已启动,访问地址为http://%s:%s",host,port) }); module.exports=app;
其中有一句是这样的
app.use('/',index);
它的含义是当服务器程序捕获访问路径为"/"的请求时,由index中间件进行相应处理。
在这里对于Express中间件网上有很好的描述
简单说,中间件(middleware)就是处理HTTP请求的函数。它最大的特点就是,一个中间件处理完,再传递给下一个中间件。App实例在运行过程中,会调用一系列的中间件。每个中间件可以从App实例,接收三个参数,依次为request对象(代表HTTP请求)、response对象(代表HTTP回应),next回调函数(代表下一个中间件)。每个中间件都可以对HTTP请求(request对象)进行加工,并且决定是否调用next方法,将request对象再传给下一个中间件。
那么index中间件从何而来呢?
varindex=require('./routes/index');
所以我们可以去routes文件夹下查看index文件,它应该长这样
varexpress=require('express'); varrouter=express.Router(); /*GEThomepage.*/ router.get('/',function(req,res,next){ res.render('index',{title:'Express'}); }); module.exports=router;
从代码注释可以看出,这里就是负责返回前面提到的Express欢迎页面的逻辑代码,当然它使用到了模板引擎的知识,我们不具体介绍,直接简单粗暴地实现我们的需求吧。
首先我们把index.html页面保存到文件目录下的public/html文件夹下(没有就自己创建),然后我们在routes/index文件中返回这个html页面,在这里我们将使用到文件读写方法。
varpath=require('path'); res.sendFile(path.resolve('public/html/index.html'));
path变量是Express中的变量,path.resolve方法可以将传入的相对地址转换为绝对地址,这里面涉及到关于NodeJs文件路径的知识,不做具体介绍。
res变量代表着服务器对于此次请求的返回对象,那么在这里相当于我们向客户端返回的是存放在public/html/index.html文件。
重启程序,访问localhost,就可以看到index.html了。
6.设置静态文件路径
对于JS和CSS这样的静态文件,在Express中都统一放置在public文件夹下,Express遇到对静态文件的请求将会从pulic下读取并返回相应文件。
而设置这一路径的语句其实也在app.js中
app.use(express.static(path.join(__dirname,'public')));
因此如果项目需要,也可以自行修改这一路经。
7.后台运行服务器
在之前我们终端运行npmstart的时候,应该可以看到所有访问打印的日志语句都在终端显示了,这时如果我们关闭终端,程序也将相应停止,那么如何在后台运行我们的服务器程序,并将打印的日志语句都写入到专门的日志文件呢,这里需要用到Linux的nohup命令和重定向符。
npmstart1>log2>error
>是linux下的重定向符。>将会重新写入目标文件,即不保存目标文件的原始内容,如果使用>>则会在目标文件后面附加内容。
在Linux中,一个程序可以在几个编号的文件流中的任一个上产生输出。然而我们必须把这些文件流的前三个看作标准输入,输出和错误,shell内部参考它们为文件描述符0,1和2。因此这个语句的意思就是将标准输出重定向到当前目录下的log文件中,将错误输出重定向到当前目录下的error文件中。
但是这样只解决了输出信息的转移输出问题,程序依然是在终端下运行的。可以使用Linux下的nohup命令实现这一目的,使用如下
nohupnpmstart1>log2>error&
不要忘记最末位的&符号。
在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作,因此需要重定向符的帮助。
后续
现在一个简单的Web服务器就搭建完成了,这只是一个Web服务器最开始的一段路,后面的开发则需要对NodeJs和Express的深入学习和使用。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。