从零开始学习nodejs(四)nodejs+express+mysql搭建后台服务(上)
系列⽂章github项⽬地址(最终版):
前⾔
前⾯已经了解了express快速搭建web项⽬的应⽤,了解了各个⽂件⽬录的作⽤,也编写了⼀个简单的页⾯测试了⼀下,所有的这些⼯作只是了解了express的⼯作流程,从这⼀篇开始慢慢搭建后台服务。在前⾯的⽂章⾥提到过这么⼀段代码位于app.js⾥
// 设置模板其中__dirname为全局变量,表⽰当前正在执⾏的脚本所在的⽬录
// 设置模版⽂件所在路径,也就是试图⽂件,都放在views层
app.set('views', path.join(__dirname,'views'));
// // 设置模版引擎,⽐如jade、ejs
app.set('view engine','ejs');
这段代码已经被我注释掉了,原因是这⾥是设置要被渲染的页⾯的,⽽且ejs跟express也是融合性极好
的模版引擎。有了这个模版引擎我们可以直接前后端放在⼀块(不好解释,可以理解为Java中的servlet+jsp,⽽且ejs也跟jsp语法类似),连接数据库后可以直接将返回的查询信息通过模版引擎渲染到页⾯中直接返回⼀个HTML页⾯给⽤户,对于⼩的项⽬这是很好的选择。本来想写⼀个例⼦,但是代码在我⽆数次的修改中已经⾯⽬全⾮,也没时间了。因为我主要想做的是前后台分离式的demo,下⾯要写的是搭建后台服务。
正题
开始之前先把数据库建好,建⽴⼀个简单的USER_INFO数据库表
看⼀下项⽬修改之后的⽬录结构
相⽐之前⽬录结构多了conf⽂件夹,⽤于配置访问数据库的连接信息。多了dao⽂件夹⽤于访问数据库,多了util⽂件夹⽤于封装⼀些⼯具类。缺失了views⽂件夹,既然要前后端分离当然不需要这些页
⾯了。
再看⼀下我想得到的最终效果
django前端套用现成模板标准的后端数据返回格式。下⾯是实现流程,依然从app.js出发
app.js
主要改动有两个,⼀个是引⼊⾃⼰编写的json格式化⼯具,另⼀个是把404与异常错误改为json格式返回(原先是返回错误页⾯,既然不需要在这⾥展⽰页⾯就改为返回错误信息描述),其余的不动。
var createError =require('http-errors');
var express =require('express');
var path =require('path');
var cookieParser =require('cookie-parser');
var logger =require('morgan');
// 引⼊路由
var indexRouter =require('./routes/index');
// 引⼊json格式化⼯具
var JsonFormat =require('./util/util').JsonFormat;
// 创建⼀个express实例
var app =express();
/
/ ⽇志中间件
app.use(logger('dev'));
数组常用函数// json解析中间件
app.use(express.json());
empty动词// 解析urlencoded请求体的中间件
app.use(express.urlencoded({ extended:false}));
// cookie解析中间件
app.use(cookieParser());
// public设置为静态⽂件夹
app.use(express.static(path.join(__dirname,'public')));
// 设置路由
app.use('/', indexRouter);
// 捕捉404错误信息并给出404提⽰,可以⾃定义提⽰信息
app.use(function(req, res, next){
});
// 异常或错误信息处理
app.use(function(err, req, res, next){
});
util.js
既然说到了json格式化⼯具,就看⼀下⾥⾯怎么写的。⾥⾯的res就是response对象,res.json()表⽰传送JSON响应,三个⽅法分别响应操作成功、操作失败和带查询数据的逻辑处理。其中0表⽰成功,1表⽰失败
// 封装返回消息
var rtnSuccess=function(res){
var obj ={"code":0,"msg":"操作成功"}
res.json(obj);
};
var rtnError=function(res,message){
var obj ={"code":1,"msg":message}
mysql菜鸟教程增删改查res.json(obj);
};
var rtnObj=function(res,data){
var obj ={"code":1,"msg":"操作成功","data":data}
res.json(obj);
};
var JsonFormat ={rtnError,rtnObj,rtnSuccess};
JsonFormat
};
conf.js
划重点,最主要的部分,在这⾥设置数据库的连接信息,既然要连接MySQL数据库,⾃然需要MySQL的依赖包
npm install mysql
// conf/db.js
// MySQL数据库连接配置
var mysql =require('mysql');
var dbconf ={
// 主机名
host:'127.0.0.1',
// 数据库⽤户名
installfromstorage是什么意思user:'root',
// 数据库密码
password:'123456',
// 链接的数据库
database:'blog',
// 链接的端⼝
port:3306
}
// 创建数据库连接池
var pool = atePool(dbconf);
// 将连接池提供给它⽤
user.js
学习的过程中,⼤多数教程直接把sql放在数据库连接后的请求中,个⼈不是很适应,⼀个是不⽅便管理⼀个是显得太乱。受Java的影响我更喜欢把数据库访问的东西拿出来,类似于当作⼀个实体类,这么说也不严谨,反正就是为了⽅便管理。
//建⽴操作数据库的sql
var user ={
insert:'INSERT INTO USER_INFO(ACCOUNT,PASSWORD,NAME,CREATE_DATE) VALUES(?,?,?,?)',
update:'UPDATE USER_INFO SET ACCOUNT=?, NAME=? WHERE ID=?',
delete:'DELETE FROM USER_INFO WHERE ID=?',
queryById:'SELECT * FROM USER_INFO WHERE ID=?',
queryAll:'SELECT * FROM USER_INFO',
updatePsd:'UPDATE USER_INFO SET PASSWORD=? WHERE ID=?'
};
//将sql提供给它⽤
userDao.js
这是访问数据库的主要实现部分,类⽐Java这⾥就是service层了
⼀共提供了6个⽅法,分别是新建⽤户、修改⽤户、删除⽤户、查询单个⽤户、查询多个⽤户、修改密码。后续有别的功能需求可以不断的添加,代码过多,看⼀个就可以。我已经注释的⾮常详细了
// 实现与MySQL交互
// 获取连接池
var pool =require('../../conf/db');
// 获取json格式化⼯具类
var json =require('../../util/util').JsonFormat;
// 获取编写好的sql语句
var sql =require('./user');
// 暴露⽅法给它⽤
//增加
add:function(req, res, next){
// 获取前台页⾯传过来的参数
// ps:res和rsp有哪些属性可以去菜鸟教程的express部分查看,或者我在⽂末附上
var param = req.query || req.search;
// 获取数据库的连接
// 捕捉链接错误信息并返回
if(err){
return;
}
// 执⾏sql语句,这⾥是插⼊⼀条信息query⼀共有三个参数,第⼀个是sql语句。第⼆个是参数数组,⼀定要和数据库的
// 数据类型相对应,也要跟sql语句的占位符相对应。第三个是回调函数,err代表访问是否出错,result代表本次访问的回执信息 connection.query(sql.insert,[param.account, param.password, param.name,new Date()],function(err, result){
// 插⼊失败,返回错误信息
if(err){
return;
}
/
/ 插⼊成功返回操作成功,result可以⾃⼰打印看⼀下,当只做查询时返回查询到的数据,其他诸如增删改操作返回的是⼀个// 对象,其中affectedRows就是受影响的⾏数,其余的属性可以⾃⾏打印看看
if(result.affectedRows>0){
}
// 释放连接,访问数据库完成⼀定要及时⼲掉此次连接请求,不然⼀会你的数据库就崩死了
});
});
},
delete:function(req, res, next){
// delete by Id
if(err){
return;
}
var id =parseInt(req.query.id);
connection.query(sql.delete, id,function(err, result){
if(err){
return;
}
if(result.affectedRows >0){
}
});
});
},
queryById:function(req, res, next){
var id = req.query.id;
if(id==null){
return;
}
if(err){
return;
}
connection.query(sql.queryById, id,function(err, result){
if(err){
return;
}
如何判断js是否加密if(result){
}
});
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论