Express框架的使用简单教程
express是一个开源的框架,大多数公司也在使用这样的框架作为Node中间层或者是服务端使用,下面来简单的讲解一下express的使用,包括(框架的搭建,数据库的操作,服务端的渲染等等)
1.安装express框架
npm install express -g // 全局安装express
express demo // 初始化express项目
cd demo
大致的目录结构如下
接下来大致介绍一下这些目录的作用
1.1 bin目录
该目录下存放的是一些配置文件如:项目启动的端口号等
1.2 public目录
存放的是一些公共的样式等等,可能有些人会有疑问这里面为什么会用到样式呢?我这Node是做后端的呀,对!!理解的没错。但是有时候我们可能会使用到服务端渲染所以才会有样式的出现
1.3 routes目录
顾名思义:routes下面的是所有的路由配置(也就是所说的接口
)路由文件如下图
var express = require('express');
var router = express.Router();
var usersController = require('../controller/users');
/* GET users listing. */
router.get('/getList', usersController.list);
router.get('/login', usersController.login);
router.post('/register', usersController.register);
router.get('/delete', usersController.deleteUser);
router.post('/update', usersController.updateUser);
module.exports = router;
router.get()
:即前端用get
的方法请求接口
router.post()
:即前端用post
的方法请求接口
请求某个接口之后会调用一个对应的函数去处理相对应的业务逻辑,拿上述代码的router.get('/getList', usersController.list)
来说,当前端请求该接口之后会去调用usersController.list
这个方法,看一下userController.list这个方法吧
const list = async (req, res) => {
const { pageSize = 5, pageNum = 1 } = req.query;
const offset = parseInt(pageSize) * (pageNum - 1);
const limit = parseInt(pageSize);
const users = await usersModel.findAndCountAll({ offset, limit });
const data = {
success: true,
data: users
}
res.send(data)
}
该函数的两个参数分别是request
和response
分别是请求对象
和响应对象
。上面的代码res.send(data)
即是将从数据库中查询的数据以json的形式返回给前端。关于findAndCountAll是sequelize
提供的。这是一组封装好的ORM
为了方便的查询数据库,读者可自行google查询用法
1.4 views目录
该目录是服务端渲染的html
或jade
文件的存放位置,不过需要在app.js
中来指定该目录app.set('views', path.join(__dirname, 'views'));
1.5 app.js
该文件是项目的根文件包括一些路由的引用配置,统一的错误处理等
2. 接口的使用
上面已经介绍过了,接口是写在routes文件中的,接下来给大家看一下routes文件的目录
该目录下的两个文件分别是index.js和users.js。既然有两个文件的话那么路由匹配的时候究竟会匹配到哪一个呢?或者说在哪引用到了这两个文件呢
原来是在app.js中引用了这两个文件,并且两个文件的使用方式不同,这就很明显了。当你请求usersRouter中接口的时候呢需要这样来写/service/接口名
即请求usersRouter中的接口的时候前面需要加上前缀/service
3. Model的使用
model是MVC分层中的M层,主要是用来建立对照模型,即使用代码建立模型与数据库中数据表的字段一一对应。那怎么使用呢?其实前面已经提到过了就是使用sequelize
// 安装sequelize
npm install sequelize
// 在项目根目录下建立model文件夹,并建立users.js文件
var Sequelize = require(‘sequelize’);
var sequelize = new Sequelize(
‘user_info’, // 数据库名
‘limingyang’, // 用户名
‘limingyang’, // 密码
{
dialect: ‘mysql’, // 数据库类型
host: ‘mysql56.rdsmscdhekdxy4f.rds.bj.baidubce.com’, // 数据库地址,本人用的是百度云的数据库
port: ‘3306’ // 端口号
}
)
// 定义表的模型(对应数据库中users数据表)
var Users = sequelize.define(‘users’,{
id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true },
user_name: {
type: Sequelize.STRING(50)
},
user_pass: {
type: Sequelize.STRING(50)
},
}, {
freezeTableName: true,
timestamps: false // 是否自定生成并查询时间戳
});
Users.sync();
module.exports = Users;
定义表的模型时候需要注意的是如果你的表中没有createAt
或者updateAt
字段的时候 需要设置timestamps: false
,否则在请求数据的时候会报错。
4. Controller的使用
controller是MVC分层的C层主要用来处理业务逻辑,即数据库的查询等相应的逻辑操作放在controller层中去完成。上面已经说过controller的简单使用,接下来主要阐述一些细节的东西。
我们在做一些业务逻辑处理的时候经常会操作到数据库,接下来说一下sequelize
的用法,举一个简单的例子
const list = async (req, res, next) => {
const { pageSize = 5, pageNum = 1 } = req.query;
const offset = parseInt(pageSize) * (pageNum - 1);
const limit = parseInt(pageSize);
const users = await usersModel.findAndCountAll({ offset, limit });
const data = {
success: true,
data: users
}
res.send(data)
}
该list函数是一个简单的分页查询功能 值得一说的是await usersModel.findAndCountAll({ offset, limit });
当使用usersModel.findAndCountAll({ offset, limit })
去操作数据库的时候返回的是promise对象,这样就可以使用async await语法来拿到请求回来的数据并返回到前端了