Express
是nodejs最常用的web server框架
1.安装与配置
使用脚手架安装 npm i express-generator -g
创建项目 express 项目名称
安装依赖 npm i cross-env nodemon inspect --save-dev
配置命令
"dev": "cross-env NODE_ENV=develop --port=8087 nodemon --inspect=9331 ./bin/www",
"prd": "cross-env NODE_ENV=production --port=8087 ./bin/www"
启动项目 npm run dev
2.app.js
const createError = require('http-errors'); // 错误处理
const express = require('express'); // 引入express
const path = require('path'); // 引入路径模块
const cookieParser = require('cookie-parser'); //引入cookie解析工具
const logger = require('morgan'); // 引入 日志处理
const session = require('express-session')
// 1. 引用路由
const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
const bookRouter = require('./routes/book');
// 使用express
const app = express();
// 创建视图 view engine setup
app.set('views', path.join(__dirname, 'views')); // 路径
app.set('view engine', 'jade'); //静态页面输出格式jade
// 使用中间件
app.use(logger('dev')); // 开发日志相关处理
app.use(express.json()); // 处理JSON格式的POST请求数据
app.use(express.urlencoded({ extended: false })); //处理非JSON格式的POST请求数据
app.use(cookieParser()); // cookie解析
app.use(express.static(path.join(__dirname, 'public'))); // 处理静态资源 图片,js,样式
// 2. 注册路由 提供一个前缀 '/' 访问对应路径的前缀 类似 indexRouter(req).then()
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/books', bookRouter);
// 路由不存在/错误处理 catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// 错误处理 error handler
app.use(function(err, req, res, next) {
// 返回错误信息 set locals, only providing error in development
res.locals.message = err.message;
// 是开发环境返回错误信息 否则返回{}
res.locals.error = req.app.get('env') === 'development' ? err : {};
// 返回状态码 render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
// index.js
// 引用路由
var express = require('express');
//创建路由
var router = express.Router();
// 设置路由
/*GET请求(路径, next中间件,向后访问 ) GET home page. */
router.get('/', function(req, res, next) {
// 页面模板渲染 'index'对应view/index.jade
res.render('index', { title: 'Express' });
// 不使用模板渲染,直接发送
// res.send('给前台做出响应');
});
module.exports = router;
3.路由
创建路由 users.js
// 引用路由
var express = require('express');
//创建路由
var router = express.Router();
// 设置路由 GET请求(路径, next中间件,向后访问 ) GET home page.
router.get('/', function(req, res, next) {
// 页面模板渲染 'index'对应view/index.jade
res.render('index', { title: 'Express' });
// 不使用模板渲染,直接发送
// res.send('给前台做出响应');
});
module.exports = router;
app.js中引用并注册路由
const usersRouter = require('./routes/users');
app.use('/users', usersRouter);
4.记录访问日志
https://github.com/expressjs/morgan
方式1:access(访问)的日志,使用morgan记录
方式2: 使用pm2自带日志记录功能
// 日志 写入方式1: 手动添加 方式2: 使用pm2, 配置完成可自动记录日志
// 判断开发模式
const env = process.env.NODE_ENV
if(env === 'production'){
// 生产环境
const filePath = path.resolve(__dirname,'logs','access.log')
const ws = fs.createWriteStream(filePath,{flags: 'a'})
app.use(logger('combined',{
immediate: true,
stream: ws
}))
} else{
app.use(logger ('dev'))
}
4.PM2部署后台项目
(1)特点
进程守护, 系统崩溃自动重启
启动多进程, 充分利用CPU资源
自带日志记录功能
(2)使用
下载 npm i pm2 -g
配置启动命令pm2 start: "prd": "cross-env NODE_ENV=production --port=8087 pm2 start ./bin/www"
启动项目 npm run prd

配置(bin/pm2.conf.json)
{
"apps":{
"name": "db",
"script": "bin/www",
"instances": 1,
"ignore_watch":[
"node_modules",
"logs"
],
"out_file": "logs/access.log",
"err_file": "logs/error.log",
"log_date_format": "YYYY-MM-DD HH:mm Z"
}
}
修改启动配置
"prd": "cross-env NODE_ENV=production --port=8087 pm2 start ./bin/pm2.conf.json"
pm2常用命令
命令名称 | 命令 |
启动 | pm2 start www.js或配置文件(xx.json) |
停止 | pm2 stop 全部停止 / pm2 stop / 停止某个 |
删除 | pm2 delete / |
重启 | pm2 restart / |
查看列表 | pm2 list |
查看信息 | pm2 info / |
5.Session模块
安装并引用 npm i express-session --save
const session = require('express-session')
// 设置session(安装并导入, 写在格式处理中间件之后 )
app.use(session({
secret : "itmm_0521", // 设置加密字符
cookie : {
path : '/', // 设置cookie的携带路径路径
httpOnly: true, // 只读(浏览器端只读, 服务器端可操作)
maxAge: 60 * 1000 //最大有效期 ms
},
// 设置令牌 name : 'token'
}))
6.解决跨域问题
(1)设置请求头的方式
可在app.js使用路由前设置
// 设置请求头, 解决跨域
app.all('*', function(req, res, next) {
res.setHeader('Access-Control-Allow-Origin','*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type, Authorization');
// res.setHeader("Content-Type", "application/json;charset=utf-8");
next();
});
(2)使用cors的方式
安装并导入cors模块, 作为中间件处理
//npm i cors --save
const cors = require('cors')
app.use(cors())
7.关于安装Express时的问题
在安装时出现如下 错误
npm WARN deprecated mkdirp@0.5.1: Legacy versions of mkdirp are no longer supported. Please
update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)
解决办法:
以管理员身份运行PowerShell
输入set-ExecutionPolicy RemoteSigned
选A
输入get-ExecutionPolicy

安装淘宝镜像npm install -g cnpm --registry=https://registry.npm.taobao.org
使用cnpm安装脚手架cnpm install express-generator -g
进入项目目录,安装依赖,并启动项目
测试: 在浏览器的地址栏中输入http://localhost:3000