当前位置: 首页 > 后端技术 > Node.js

使用angular4和nodejs-express搭建一个简单的网站(三)——express访问mysql

时间:2023-04-03 14:17:52 Node.js

上一章我们为后端express服务设置了跨域访问,并安装了bootstrap和ng-前端angularBootstrap依赖并配置,后端express安装mysql,处理文件上传的多方依赖,创建mysql数据库birthday。本章我将介绍express访问mysql数据库的方法。mysql访问的基本配置使用visualstudiocode(以下简称vscode)打开后端程序目录server,在server目录下创建一个db目录,用于存放路由初始化文件。在db目录中添加一个新的dbconnpool.js文件。文件中的代码是:varmysql=require('mysql');module.exports=(function(){varpool=mysql.createPool({host:'localhost',user:'root',password:'******',database:'birthday',port:'3306'});pool.on('connection',function(connection){connection.query('SETSESSIONauto_increment_increment=1');});returnfunction(){//返回唯一池returnpool;}})();这是一个立即执行的函数,pool对象是单例对象,保证了对数据库的所有操作都针对同一个数据库对象(我是这么理解的,可能有偏差)。mysql.createPool()方法创建一个mysql访问池。options是一个参数对象,包括mysql主机名、登录mysql用户名、密码,以及要访问的数据库和端口(默认为3306)。关于数据库连接池的概念,给大家推荐这个地址,介绍的很详细。函数pool.on('connection',function(conection){...})是数据库连接时的回调函数。这里我主要设置自增数据的步长值为1,处理用户发送的注册用户请求,将用户数据存储到mysql数据库中。打开server目录下routers目录下的users.js文件。这是一个由express-generator构建的文件。我将使用此文件作为处理用户请求的文件。这个文件中加载了Router实例,Router是一个完整的中间件和路由系统。有了这个中间件,就可以方便的处理所有的路由访问。同时加载我们刚刚创建的dbconnpool.js文件。varexpress=require('express');varrouter=express.Router();varconnPool=require('../db/dbconnpool');varpool=connPool();这里还涉及到jwt用户认证处理,作为用户注册,我们只需要将用户认证信息发送给前端就OK了!我对jwt的使用不是很熟练。我只是了解大概的原理和使用方法。这是供您参考的示意图。有兴趣的可以参考这篇文章,还是很详细的。为了程序的完整性,我们先安装加载这个中间件。在express中使用jwt,需要用到两个中间件express-jwt和jsonwebtoken,安装方法:cnpminstallexpress-jwt--savecnpminstall--savejsonwebtoken在user.js文件中我们只需要用到jsonwebtoken,下面介绍一下这个文件:varjwt=require('jsonwebtoken');让我们开始处理用户注册请求,这里是代码:router.post('/register',function(req,res,next){letuserName=req.body['name'];letuserPass=req.body['密码'];letemail=req.body['email'];if(userName.length===0||userPass.length===0){res.status(400).json({code:'-200',msg:'未输入用户名或密码'});return;}letparams=[userName,userPass,email];letsqlStr='insertintouser(uname,upass,uemail)values(?,?,?);'pool.getConnection(function(err,conn){if(err){res.status(400).json({code:'-200',msg:'数据库连接失败'});return;}conn.query(sqlStr,params,function(err,rs){if(err){if(err.message.includes('Duplicate')){res.status(400).json({code:'-200',msg:'注册用户时出错:用户名重复'});return;}else{res.status(400).json({code:'-200',msg:'Errorregisteringuser:'+err.message});返回;}}res.status(200).json({token:jwt.sign({userid:rs.insertId},'secret')});});conn.release();});});我们来分析这段代码:首先让我们准备一些数据客户端POST方式发送的注册信息包括用户名(name)、密码(password)和邮箱地址(email),这三个数据分别从req.body中取出,以及分别赋值给三个变量userName,userPass,emailmysql查询语句赋值给变量sqlStrletsqlStr='insertintouser(uname,upass,uemail)values(?,?,?);',并使用上面的赋值userName、userPass、email变量声明查询参数数组params(实际上是给sql查询语句的3?赋值)。获取数据库连接,调用pool.getConnection()函数连接数据库。连接回调函数中有两个参数err和conn。err参数包含了连接数据库时的错误信息。如果在连接过程中出现错误,可以通过错误处理代码向客户端发送错误信息,并立即返回。如果没有错误,就可以对数据库进行操作了。对数据库执行操作。注册用户对数据库的操作就是插入数据。前面赋值的sql语句是标准的sqlinsert语句,只是将values的值换成了?,从而将我们params数组中的变量作为参数。操作数据库的方法是conn.query()函数,它有3个参数,第一个参数是要执行的SQL语句,第二个参数是查询参数,第三个参数是回调函数。回调函数包括两个参数。第一个参数也是err参数,用于处理发生的错误。我把同一用户重复注册的错误处理放在这里。如果出现重复注册,mysql会返回一条消息,其中包含Thestatementof'ER_DUP_ENTRY:Duplicateentry''forkey'un''证明你发送给mysql的信息违反了数据的唯一性属性。根据这个错误提示,可以处理重复注册的用户。第二个参数rs包含一些新插入的数据信息,其中最重要的是insertId,也就是我们的用户id。如果数据插入mysql数据库成功,会返回200的状态信息,并向客户端发送一个json对象。该对象包含一个令牌密钥。这个key对应'jsonwebtoken'的sign函数生成的认证信息。该信息包含从rs中获取的insertId。最后,使用conn.release();释放与数据库的连接。登录请求的处理登录请求的处理也很简单,主要是查询数据库,找到正确的用户名和密码,发送认证信息,没有找到则发送错误信息。具体代码如下:router.post('/login',function(req,res,next){letuserName=req.body['name'];letuserPass=req.body['password'];letparams=[userName,userPass];letsqlStr="select*fromuserwhereuname=?andupass=?";pool.getConnection(function(err,conn){if(err){res.status(400).json({code:'-200',msg:'数据库连接失败'});return;}conn.query(sqlStr,params,function(err,rs){if(err){res.status(400).json({code:'-200',msg:'Errorqueryingusers:'+err.message});return;}if(rs.length===0){res.status(401).json({code:'-200',msg:'登录失败,用户名或密码错误!'});return;}res.status(200).json({token:jwt.sign({userid:rs[0].uid},'秘密')});});conn.release();});});这次jwt认证信息中的userid来自于查询到的uid。这就是用于用户注册和登录的快速处理程序。中间可能还有不合理的地方,还望大家指正。今天就到此为止。感谢您的关注...