Express框架根据官方介绍,Express是一个基于Node.js平台的极简灵活的Web应用开发框架,可以轻松创建各种Web或移动应用。今天让我们简单了解一下Express。框架安装首先安装Express,新建一个工作文件夹,并命名为myapp,初始化该文件夹下的环境:npminit官方推荐的入口文件名叫做app.js,入口点:(index.js)app.js的当然也可以使用npm默认的index.js文件名。接下来,安装Expressnpminstallexpress--save。环境准备好了。现在尝试创建一个Express应用,进入myapp目录,新建一个app.js文件,复制如下代码:constexpress=require('express');constapp=express();app.get('/',(req,res)=>{res.send('这是一个Express应用程序')});变种服务器=应用程序。listen(3000,()=>{console.log('servicestartedhttp://localhost:3000')})上面的代码启动一个服务并监听来自端口3000的所有传入连接请求。它将返回“This是任何(/)URL或路由的Expressapp"字符串。其他所有路径返回404启动应用程序节点app.jsExpressApplicationGeneratorExpressApplicationGenerator可以快速创建骨架应用程序安装:npminstallexpress-generator-gd安装后,创建一个名为myapp的应用程序:expressmyapp这个命令会创建myapp在当前目录下生成应用骨架安装依赖包。cdmyappnpminstall依赖安装完成,可以启动应用。Windows平台在cmd中输入:setDEBUG=myapp&npmstartMac或者Linux平台输入:DEBUG=myappnpmstart然后在浏览器中打开http://localhost:3000/URL就可以看到应用了。应用首次启动时,下次只需要输入npmstart即可打开package.json文件。应用程序的启动实际上依赖于这行代码:"scripts":{"start":"node./bin/www"}RoutingExpress有两个主要内容:路由中间件一、路由)由一个URI(或路径)和具体的HTTP方法(GET、POST等),这涉及应用程序如何响应客户端访问某个网站节点。每个路由可以有一个或多个处理函数,当匹配到路由时将执行这个或这些函数。先写一个简单的路由,在routes目录下新建orders.js文件:varexpress=require('express');varrouter=express.Router();router.get('/',function(req,res,nest){res.render('订单',{msg:'订单首页'})})router.get('/list',function(req,res,next){res.send('订单列表')})//导出模块.exports=router;页面文件写好后,需要在app.js中挂载,varorders=require('./routes/orders');···app.use('/Orders',orders)最好和其他路由组件。在地址栏输入相应的url,打开相应的页面路由方法实例://访问网站首页,返回“HelloWorld!”App.get('/',function(req,res){res.send('HelloWorld!');});//网站首页接受POST请求app.post('/',function(req,res){res.send('GotaPOSTrequest');});///用户节点接受PUT请求app.put('/user',function(req,res){res.send('GotaPUTrequestat/user');});///user节点接受DELETE请求app.delete('/user',function(req,res){res.send('GotaDELETErequestat/user');});middle中间件是Web应用程序中请求-响应循环过程中可以访问请求对象(req)、响应对象(responseobject(res))、中间件的函数,一般称为next变量。中间件的分类:应用级中间件路由级中间件错误处理中间件内置中间件第三方中间件应用级中间件应用级中间件使用app.use()和app.METHOD()绑定到app对象上,其中,METHOD为需要处理的HTTP请求的方法,如get、put、post等。varapp=express();//挂载路径没有中间件,每次请求的应用程序将执行中间件app.use(function(req,res,next){console.log('Time:',Date.now());next();});//挂载到/user/:id的中间件,任何指向/user/:id的请求都会执行它app.use('/user/:id',function(req,res,next){console.log('RequestType:',req.method);next();});//路由和句柄函数(中间件系统),处理指向/user/:id的GET请求app.get('/user/:id',function(req,res,next){res.send('USER');});执行完一个中间件后,next()会让程序继续执行下一个中间件。如果没有next(),程序就不会继续执行。当向页面发送内容时,程序不会执行。我们也可以把它安装在一组中间件中},function(req,res,next){console.log('RequestType:',req.method);next();})路由级中间件路由级中间件与应用级中间件相同,除了它绑定的对象是express.Router()。上一节我们写了orders.js,它的内容是一个路由级中间件路由级负载,使用router.use()或router.VERB()。上述在应用层创建的中间件系统,可以通过如下代码重写为路由层:varapp=express();varrouter=express.Router();//对于没有挂载路径的中间件,每一个Eachrequest会执行中间件router.use(function(req,res,next){console.log('Time:',Date.now());next();});//一个中间件栈,显示任何HTTP请求/user/:idrouter.use('/user/:id',function(req,res,next){console.log('RequestURL:',req.originalUrl);next();},function(req,res,next){console.log('RequestType:',req.method);next();});//一个中间件栈,处理指向/user/:idGET请求router.get('/user/:id',function(req,res,next){//如果用户id为0,跳转到下一条路由if(req.params.id==0)next('route');//负责将控制传递给栈中的下一个中间件elsenext();//},function(req,res,next){//渲染常规页面res.render('regular');});//处理/user/:id,渲染一个特殊页面router.get('/user/:id',function(req,res,next){console.log(req.params.id);res.render('special');});//挂载路由到应用app.use('/',router);错误处理中间件错误处理中间件类似于其他中间件定义,不同之处在于使用了4个参数,而不是3个,具有以下签名:(err,req,res,next)。app.use(function(err,req,res,next){console.error(err.stack);res.status(500).send('Somethingbroke!');});在其他app.use()路由调用后,最后定义错误处理中间件,如:varbodyParser=require('body-parser');varmethodOverride=require('method-override');app.use(bodyParser());app.use(methodOverride());app.use(function(err,req,res,next){//业务逻辑});在我们创建的app中,app.js中的错误处理中间件是这样写的:err.message;res.locals.error=req.app.get('env')==='development'?err:{};//渲染错误页面res.status(err.status||500);res.render('错误');});错误中间件执行时,会调用views目录下的error.jade文件,在页面打印详细的错误信息内置中间件express.static(root,[options])express.static是唯一内置的Express的中间件。它基于serve-static,负责为Express应用程序中的静态资源提供服务。这个内置的中间件也可以在app.js文件中找到app.use(express.static(path.join(__dirname,'public')));详情请参考官方文档:www.expressjs.com.cn/guide/using-middleware.html第三方中间件使用第三方中间件为Express应用添加更多功能。安装具有所需功能的节点模块并将其加载到应用程序中,可以在应用程序级别或在路由级别。事实上,我们创建的应用程序引入了两个第三方中间件,你可以在package.json中找到“dependencies”:{"body-parser":"~1.18.2","cookie-parser":"~1.4.3","debug":"~2.6.9","express":"~4.15.5","jade":"~1.11.0","morgan":"~1.9.0","serve-favicon":"~2.4.5"}其中body-parser和cookie-parser是两个第三方中间件模板引擎Express。默认的模板引擎是jade。现在jade改名pug了,没错,斯里,芭莎嘿嘿!pug的语法可以参考pug文档:https://pug.bootcss.com/api/g...我们在views目录下创建一个orders.jade文件doctypehtmlhtmlheadtitleorderbodyh1#{msg}p在时间开始之前,然后使用路由来渲染它:router.get('/',function(req,res,nest){res.render('orders',{msg:'orderhomepage'})})当请求到主页时,orders.jade将被呈现为一个HTML文档进程管理器。在写程序的时候,我们发现每次更改文件后,都需要在命令行中停止当前服务,然后输入npmstart,非常麻烦。我们需要一个自动刷新工具。下面介绍一下pm2的安装:npminstallpm2-gd安装完成后,运行我们的程序:还记得我们之前说的npmstart的启动路径>pm2start./bin/www--watch[PM2]ApplyingactionrestartProcessIdonapp[www](ids:0)[PM2][www](0)?[PM2]进程成功启动┌─────────────────────────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────────┬────────────┬──────────┐│应用名称│id│模式│pid│状态│重启│运行时间│cpu│MEM│用户│观看│├──────────┼─────────────────────────────────e────────┼────────────┼──────┼────────────────────────────────────────────────────────────────────┤│www│0│fork│14448│在线│0│0s│0%│8.6MB│pureview│启用│└──────────┴────┴────────┴────────┴──────────┴────────────┴──────────┴──────┴────────────┴────────────┴────────────┘使用`pm2show
