Express初始化项目,路由拦截,数据处理,数据库操作
express
是一个框架,是在被引入项目中使用的,而非工具。
express-generator
是一个工具,此工具的作用是生成express
项目。
安装express:npm install express --save
安装express项目生成器:npm install express-generator -g
创建建项目:express project-name
安装依赖:npm install
运行项目:npm run start
nodemon
是一种工具,可以自动检测到目录中的文件更改时通过重新启动应用程序来调试基于node.js
的应用程序。
安装nodemon:npm install -g nodemon
运行项目:nodemon app.js
app.js文件内容描述:
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var ejs = require('ejs');
var loginRouter = require('./routes/login');
var userRouter = require('./routes/user');
var app = express();
var http = require('http');
var server = http.createServer(app);
// 模板相关设置
// view engine setup
app.set('views', path.join(__dirname, 'views')); // 设置模版文件夹的路径
//app.set('view engine', 'ejs');//设置视图为ejs引擎
app.engine('html',ejs.__express); //设置视图为html引擎,ejs在页面仍然可用
app.set('view engine', 'html');//设置视图为html引擎,ejs在页面仍然可用
// app.use作用-以下此处都有
// 1.加载中间件,所有中间件都必须在路由之前加载
// 2.加载静态区域
// 3.加载路由
// 4.使用拦截器
// 记录日志的一个中间件
// 可以有各种记录方式:记录到console,记录到文件中,记录到控制台,只记录错误日志,同一天的日志记录到同一个文件中,添加日志id等等
app.use(logger('dev'));
// express.json()函数是Express中的内置中间件函数。它使用body-parser解析带有JSON有效负载的传入请求。
// 假设使用POST传入参数为{name: 'laowang'}
// 使用此中间件,可以直接读取传入参数内容,通过req.body.name得到的是laowang
// 不使用此中间件,那么使用req.body.name就会报错,错误信息如下:TypeError:Cannot read property 'name' of undefined
app.use(express.json());
// extended: true 表示可以post请求
// 用于解析 application/x-www-form-urlencoded
// 解析 URL-encoded 格式的请求体数据
app.use(express.urlencoded({ extended: false }));
// cookie管理的一个中间件
// 1.可以设置以及获取cookie
// 2.可以进行cookie加密,需要设置盐和signed:true
// 3.可以设置cookie共享域名
// 学习网址:https://www.cnblogs.com/ywjfx/p/10403903.html
app.use(cookieParser());
// 处理静态请求
// 设置了public文件,public下所有文件都会以静态资源文件形式返回
app.use(express.static(path.join(__dirname, 'public')));
// 放在路由前面,就是路由拦截,可以有多个拦截路由,按顺序执行
// 可以进行鉴权等操作
app.use(function (req, res, next) {
// 路由中next表示执行匹配的下一项路由或者下一项拦截路由
// 如果next带参数,比如next(123),就会直接跳转到错误捕获路由,输出错误信息
next();
});
// 加载路由
app.use('/', loginRouter);
app.use('/user', userRouter);
// 放在路由后面,就是错误路由捕获
// 当所有路由都不匹配的时候,报404
// 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.send({
code: 400,
msg: '路由不存在'
});
});
server.listen(3006);
路由文件user.js
var express = require('express');
var router = express.Router();
var user = require('../controllers/userController')
// 路由拦截
router.get('/getArticleByUserId', user.getArticleByUserId);
module.exports = router;
具体处理函数userController.js
var dbConfig = require('../util/dbConfig')
// 获取指定用户的文章列表
const getArticleByUserId = (req, res) => {
let { user_id } = req.query // 获取get请求路由参数,post使用req.body
var sql = "select * from article where user_id=?"
var sqlArr = [user_id]
var callBack = (err, data) => {
if (err) {
console.log('连接出错了')
} else {
res.send({
list: data
})
}
}
dbConfig.sqlConnect(sql, sqlArr, callBack)
}
module.exports = {
getArticleByUserId
}
数据库连接处理函数dbConfig.js
const mysql = require('mysql')
// 数据库链接配置
const config = {
host: 'localhost',
port: '3306',
user: 'root',
password: 'password',
database: 'test'
}
const pool = {
// 将创建连接池独立出来,这样不用每次发起数据库连接都重复创建连接池
pool: mysql.createPool(config),
// 连接数据库,并执行sql语句
sqlConnect(sql, sqlArr, callBack) {
// 链接数据库
this.pool.getConnection((err, conn) => {
if (err) {
console.log('数据库连接失败')
return
}
// 执行数据库操作
conn.query(sql, sqlArr, callBack)
// 关闭数据库链接
conn.release()
})
}
}
module.exports = pool