express框架的基于node.js的web应用开发框架。
//引入express框架 返回值其实是一个方法 //再创建服务器就不需要再引用http模块的createHttp方法了。 const express = require('express'); //创建网站服务器 const app = express(); app.get('/',(req,res)=>{ /* send()响应客户端 1、res.send()方法内部会检测响应内容的类型 2、res.send()方法会自动设置http状态码 3、res.send()方法会自动设置响应的内容类型及编码 */ res.send('hello express world'); }) app.get('/list',(req,res)=>{ res.send({name:'张三',age:20}); }); //监听端口 app.listen(3000,()=>{console.log('服务器启动成功')})
中间件就是一些方法,可以接收客户端发送的请求、对请求作出响应,也可以将请求交给下一个中间件来处理。
中间件主要由两部分组成:中间件方法和请求处理函数。
app.get('请求路径','处理函数'); //接收并处理get请求 app.post('请求路径','处理函数'); //接收并处理post请求
可以针对同一个请求设置多个中间件,对同一个请求进行多次处理。
app.get('/request',(req,res,next)=>{ req.name = '张三'; }); app.get('/request',(req,res)=>{ res.send(req.name); })
app.use((req,res,next) => { console.log(req.url); next(); })
app.use('/admin',(req,res,next) => { console.log(req.url); next(); })
const express = require('express'); const app = express(); // app.use()必须放在前面 app.use((req,res,next)=>{ console.log('请求app.use中间件'); next(); }); //当客户端访问request请求时执行此中间件 app.use('/request',(req,res,next)=>{ console.log('请求app.use中间件request路径'); next(); }); app.get('/list',(req,res,next)=>{ res.send('张三'); }); app.get('/request',(req,res,next)=>{ req.name = '张三'; next(); }); app.get('/request',(req,res)=>{ res.send(req.name); }); //监听端口 app.listen(3000,()=>{console.log('服务器启动成功')})
// err就是错误对象 const express = require('express'); const app = express(); app.get('/index',(req,res)=>{ throw new Error('程序出错'); res.send('正常执行') }); //错误处理中间件 err就是错误对象 app.use((err,req,res,next)=>{ res.status(500).send('服务器出错'); }); //监听端口 app.listen(3000,()=>{console.log('服务器启动成功')})
const express = require('express'); const fs = require('fs'); const app = express(); app.get('/index',(req,res,next)=>{ fs.readFile('./007.app.use.js','utf-8',(err,result)=>{ if(err != null){ next(err); }else{ res.send(result); } }); // throw new Error('程序出错'); // res.send('正常执行') }); //错误处理中间件 err就是错误对象 app.use((err,req,res,next)=>{ res.status(500).send('服务器出错'); });
const express = require('express'); const fs = require('fs'); const promisify = require('util').promisify; const readFile = promisify(fs.readFile); const app = express(); app.get('/index',async (req,res,next)=>{ try{ await freadFile('./a.js'); }catch(ex){ next(ex); } }); //错误处理中间件 err就是错误对象 app.use((err,req,res,next)=>{ res.status(500).send('服务器出错'); }); //监听端口 app.listen(3000,()=>{console.log('服务器启动成功')})
const express = require('express'); const app = express(); //构建模块化路由对象 const home = express.Router(); //为路由匹配路径 app.use('/home',home); //调用home路由下面的get方法继续创建二级路由 home.get('/index',(req,res)=>{ // /home/index res.send('欢迎。'); }); app.listen(3000,()=>{ console.log('ok'); });
将路由文件单独放进router文件夹,构建模块化的路由
/*home.js*/ const express = require('express'); const home = express.Router(); home.get('/index',(req,res)=>{ res.send('欢迎来到首页'); }); module.exports = home;
/*admin.js*/ const express = require('express'); const admin = express.Router(); admin.get('/index',(req,res)=>{ res.send('欢迎来到管理页面'); }); module.exports = admin;
/*主界面 模块化路由2.js*/ const express = require('express'); const home = require('./router/011.home'); const admin = require('./router/012.admin'); const app = express(); //选择进入二级路由 app.use('/home',home); app.use('/admin',admin); app.listen(3000,()=>{ console.log('ok'); });
const express = require('express'); const app = express(); app.get('/index',(req,res)=>{ //获取get请求参数 res.send(req.query); }); app.listen(3000,()=>{ console.log('ok'); });
在浏览器输入http://localhost:3000/index?name=张三&age=20
,按回车。
输出对象:{“name”:“张三”,“age”:“20”}
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); /* 拦截所有请求 extended:false方法内部使用querystring模块处理请求参数的格式 extended:true方法内部使用第三方模块qs处理请求参数的格式 */ app.use(bodyParser.urlencoded({extended:false})); app.post('/add',(req,res)=>{ //获取post请求参数 res.send(req.body); }); app.listen(3000,()=>{ console.log('ok'); });
<form action="http://localhost:3000/add" method="POST"> <input type="text" name="username"> <input type="text" name="paw"> <input type="submit" name=""> </form>
在表单内输入张三、123456,跳转页面,输出对象:{“username”:“张三”,“paw”:“123456”}
const express = require('express'); const app = express(); app.get('/index/:id/:name/:age',(req,res)=>{ //req.params获取请求参数 res.send(req.params); }); app.listen(3000,()=>{ console.log('ok'); });
浏览器输入路径localhoat:3000/index/10/张三/56
,输出{“id”:“10”,“name”:“张三”,“age”:“56”}
app.use(express.static('public'));
拦截请求,由方法处理,将静态资源的目录告诉方法。
方法内部会判断客户端发送的请求是否是静态资源请求;
若是,方法内部直接将资源响应给客户端,终止当前请求。
若不是,调用next()方法,将请求交给下一个中间件。
const express = require('express'); const path = require('path'); const app = express(); //实现静态资源访问功能 开启静态资源文件 app.use(express.static(path.join(__dirname,'public'))); //也可以添加一个虚拟路径 //app.use('static' , express.static(path.join(__dirname,'public'))); app.listen(3000,()=>{ console.log('ok'); });
访问localhost:3000
或localhost:3000/index.html
或localhost:3000/static/index.html
。
const express = require('express'); const path = require('path'); const app = express(); //1、告诉express框架使用什么模块引擎,渲染什么后缀的模板文件(1.模块后缀;2.使用的模块引擎) app.engine('art',require('express-art-template')); //2、告诉express框架模板存放的位置在那里 app.set('views',path.join(__dirname,'views')); //3、告诉express框架模板的默认后缀是什么 app.set('views engine','art'); app.get('/index',(req,res)=>{ //使用res.render渲染 //1、拼接了模板路径 //2、拼接了模板后缀 //3、哪个模板跟哪个数据进行连接 //4、将拼接结果响应给客户端 res.render('index',{ msg:message, }) }) app.listen(3000,()=>{ console.log('ok'); });
将变量设置到app.locals对象下面,此数据可在所有模板中获取到。
app.locals.users = [{ name:'张三', age:20, },{ name:'李四', age:25, }]
<ul> {{each users}} <li> {{$value.name}} {{$value.age}} </li> {{/each}} </ul>