使用Express框架搭建服务器会比原生js写法更简洁。javascript
// npm install express 下载插件 // 引入express框架 const express = require('express'); // 建立网站服务器 const app = express(); // 接收全部请求的中间件,任何请求都会先通过这个use中间件 //这里能够拦截全部的请求,进行判断 app.use((req, res, next) => { console.log('请求走了app.use中间件'); //next能够进入下一个中间件,不然会停留在此 next() }) // 当客户端访问/request请求的时候走当前中间件 app.use('/request', (req, res, next) => { console.log('请求走了app.use / request中间件') next() }) //设置get请求 app.get('/request', (req, res, next) => { req.name = "张三"; next(); }) app.get('/request', (req, res) => { // 最终返回"张三" res.send(req.name) }) // 监听端口 app.listen(3000); console.log('网站服务器启动成功');
错误处理中间件;html
app.get('/index', (req, res, next) => { fs.readFile('./01.js', 'utf8', (err, result) => { if (err != null) { //若是出错,将错误传给中间件 next(err) } else { res.send(result) } }) }) // 错误处理中间 app.use((err, req, res, next) => { //设置状态码为500并输出错误信息 res.status(500).send(err.message); })
异步函数错误的捕获;java
// 引入express框架 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 { //异步函数错误须要手动捕获,成功则会跳过catch await readFile('./aaa.js') } catch (ex) { //若是代码出错会执行catch语句内的方法 next(ex); } }) // 错误处理中间 app.use((err, req, res, next) => { res.status(500).send(err.message); })
构建模块化路由;express
//admin.js文件内容 const express = require('express'); //建立路由 const admin = express.Router(); admin.get('/index', (req, res) => { res.send('欢迎来到博客管理页面') }); //模块导出,值是admin module.exports = admin; ----------------------------------------- //home.js文件内容 const express = require('express'); //建立路由 const home = express.Router(); home.get('/index', (req, res) => { res.send('欢迎来到博客首页页面') }); //模块导出,值是home module.exports = home; ----------------------------------------- // 导入模块 const home = require('./route/home'); const admin = require('./route/admin'); //经过不一样的请求参数访问不一样的页面 app.use('/home', home); app.use('/admin', admin);
获取get参数npm
//访问:localhost:3000/index?user=root&password=root app.get('/index', (req, res) => { //req.query能够获取get请求参数,输出的结果为{"user":"root","password":"root"} res.send(req.query) })
获取post参数服务器
// npm install body-parser 下载插件 // 引入express框架 const express = require('express'); const bodyParser = require('body-parser'); // 建立网站服务器 const app = express(); // 拦截全部请求 // extended: false 方法内部使用querystring模块处理请求参数的格式 // extended: true 方法内部使用第三方模块qs处理请求参数的格式 app.use(bodyParser.urlencoded({extended: false})) app.post('/add', (req, res) => { // 接收post请求参数,body是bodyParser处理获得的 res.send(req.body) })
路由参数;app
//请求必需要有如下上参数才能调用 如:localhost:3000/index/1/zhangsan/18 app.get('/index/:id/:name/:age', (req, res) => { // 接收post请求参数,输出参数 res.send(req.params) })
静态资源访问功能框架
// 实现静态资源访问功能 // path.join(__dirname, 'public')路径解析,__dirname当前目录,public文件夹 // '/static'添加虚拟路径 // localhost:3000/static/文件名 便可直接访问 app.use('/static',express.static(path.join(__dirname, 'public')))
模板引擎异步
// npm install art-template express-art-template 同时下载两个插件,空格分开 const express = require('express'); const path = require('path'); const app = express(); // 1.告诉express框架使用什么模板引擎渲染什么后缀的模板文件 // 1.模板后缀 // 2.使用的模板引擎 app.engine('art', require('express-art-template')) // 2.告诉express框架模板存放的位置是什么 // 第一个views是框架固定的,第二个是文件名 app.set('views', path.join(__dirname, 'views')) // 3.告诉express框架模板的默认后缀是什么 app.set('view engine', 'art'); //访问localhost:3000/index 便可访问 app.get('/index', (req, res) => { // res.render渲染模板,res.render作了如下几件事; // 1. 拼接模板路径 // 2. 拼接模板后缀 // 3. 哪个模板和哪个数据进行拼接 // 4. 将拼接结果响应给了客户端 res.render('index', { msg: 'message' }) });
app.locals对象async
//index.art文件跟list.art文件内容 {{ msg }} <ul> {{each users}} <li> {{$value.name}} {{$value.age}} </li> {{/each}} </ul> ---------------------------
//公共信息能够添加到locals中,这样全部的模板都能获取到 app.locals.users = [{ name: 'zhangsan', age: 20 },{ name: '李四', age: 30 }] app.get('/index', (req, res) => { res.render('index', { msg: '首页' }) }); app.get('/list', (req, res) => { res.render('list', { msg: '列表页' }); })