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>