//引入express框架
const express = require('express');
//创建网站服务器
const app = express();
//处理客户端请求
app.get('/', (req, res) => {
// send()取代end()
// 1.send方法内部会检测响应内容的类型
// 2.send方法会自动设置http状态码
// 3.send方法会自动设置响应内容类型及编码
res.send('hello express');
})
//监听端口
app.listen(3000);
console.log('网站服务器启动成功');
什么是中间件:
app.use([path,] (req, res[, next])){
....
}
当程序出现错误时,调用next()方法,并且将错误信息通过参数的形式传递给next()方法,即可触发错误处理中间件。
app.get("/", (req, res, next) => {
fs.readFile("/file-does-not-exist", (err, data) => {
if (err) {
next(err);
}
});
});
app.use((err, req, res, next) => {
res.status(500).send('服务器发生未知错误');
})
在node.js中,异步API的错误信息都是通过回调函数获取的,支持Promise对象的异步API发生错误可以通过catch方法捕获。
https://www.expressjs.com.cn/guide/error-handling.html
app.get("/", async (req, res, next) => {
try {
await User.find({name: '张三'})
}catch(ex) {
next(ex);
}
});
// app.js
const home = require('./route/home.js');
const admin = require('./route/admin.js');
//将路由和路径进行匹配
app.use('/home', home);
app.use('/admin', admin);
// home.js
const express = require('express');
const home = express.Router();
//用户请求/home/index页面时进入
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;
Express框架中使用req.query即可获取GET参数,框架内部会将GET参数转换为对象并返回。
app.get('/', (req, res) => {
console.log(req.query); // {"name": "zhangsan", "age": "30"}
});
Express中接收post请求参数需要借助第三方包 body-parser。
// 引入body-parser模块
const bodyParser = require('body-parser');
// 配置body-parser模块
//extended: false表示使用系统模块的queryString来处理请求参数的格式
//extended: true表示使用第三方模块qs来处理
app.use(bodyParser.urlencoded({ extended: false }));
// 接收请求
app.post('/add', (req, res) => {
// 接收请求参数
console.log(req.body);
})
请求路径:
localhost:3000/find/123
服务器处理:
//如果没有参数,则匹配不到
app.get('/find/:id', (req, res) => {
console.log(req.params); // {id: 123}
});
通过Express内置的express.static可以方便地托管静态文件,例如img、CSS、JavaScript 文件等。
设置静态资源路径后,在html页面中请求页面的页面是 app.use(express.static(‘public’));中的路径拼接上html页面中静态资源的路径。
//static参数是静态资源所在的位置,建议使用绝对路径
app.use(express.static('public'));
// 当渲染后缀为art的模板时 使用express-art-template
app.engine('art', require('express-art-template'));
// 设置模板存放的目录,推荐使用绝对路径
app.set('views', path.join(__dirname, 'views'));
// 渲染模板时不写后缀 默认拼接art后缀
app.set('view engine', 'art');
app.get('/', (req, res) => {
// 渲染模板
res.render('index',{
user: {
name: 'aui',
tags: ['art', 'template', 'nodejs']
}
});
});
将变量设置到app.locals对象下面,这个数据在所有的模板中都可以获取到。
// req.app.locals.userInfo = userData;
app.locals.users = [{
name: '张三',
age: 20
},{
name: '李四',
age: 20
}]
http://aui.github.io/art-template/zh-cn/docs/imports.html
app.js中
//导入dateformat日期处理模块
const dateFormat = require('dateformat');
//向模板内部导入dateFormate变量
template.defaults.imports.dateFormat = dateFormat;
index.art中
<span>{{dateFormat($value.createDate, 'yyyy-mm-dd')}}span>