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

koa搭建nodejs项目并注册接口

时间:2023-04-03 11:12:48 Node.js

使用nodejs注册接口逻辑处理会比较复杂,直接通过express或者koa可以简化开发流程,这里记录下使用koa搭建nodejs项目并注册接口,对koa不熟悉的可以参考这个。nodejs启动服务更简单--koa项目结构项目整体结构如下,将不同功能的文件分成模块,让代码逻辑更清晰node_modules//安装包src//部分自编码app//注册app常量//定义常量controller//注册接口中间件使用的方法//处理数据router的中间件//路由服务//定义sql语句utils//处理数据的方法main.js//entry.env//放在环境变量配置文件中package-lock.json//包依赖package.json//需要安装哪些包来注册appkoa中的所有操作都需要通过注册的app对象来完成,首先在app/index中注册.js并exportconstkoa=require('koa')constapp=newKoa()module.exports=apphttpstartservice在src文件夹下创建main.js文件,导入app对象,启动http服务constapp=require('./app')const{APP_PORT}=require('./app/config')app.listen(APP_PORT,()=>{console.log('开启服务')})账号密码,portnumber这样的信息直接写在文件里不安全,上传或者分享项目的时候容易泄露,所以保存在不影响项目的文件里,在根目录下加一个.env文件目录,并使用dotenv更改.env文件中的配置项在环境变量APP_PORT=8000中注册,并在app文件夹中新增一个config.js文件,用于保存配置信息,防止随意更改。constdotenv=require('dotenv')dotenv.config();模块.exports={APP_PORT}=process.env启动main.js后,已经可以监听8000端口了,因为没有响应请求,所以此时访问8000时,只能返回NotFindregisteredroutes.一组路由是一组映射。关系,定义路径和处理函数,注册的接口逻辑演示如下,中间件用于判断数据的正确性,控制层的函数用于响应constRouter=require('koa-router')constRegisterRouter=newRouter({prefix:'/register'})const{register}=require('../controller/register.controller')const{verifyUser,encryptionPwd}=require('../middleware/register.middleware')RegisterRouter.post('/',verifyUser,encryptionPwd,register)module.exports=RegisterRouter中间件判断是否传入了用户名和密码,是否已经注册,并对传入的私有数据const进行加密crypto=require('crypto')const{hasUser}=require('../service/register.service')const{USER_ALREADY_EXISTS,NAME_OR_PASSWORD_REQUIRED}=require('../constants/error-types')classRegisterMiddleWare{异步verifyUser(ctx,next){nameconst{,password}=ctx.request.bodyif(!name||!password){consterror=newError(NAME_OR_PASSWORD_REQUIRED)returnctx.app.emit('error',error,ctx)}让用户=awaithasUser(name)if(users){consterror=newError(USER_ALREADY_EXISTS)returnctx.app.emit('error',error,ctx)}awaitnext()}asyncencryptionPwd(ct)x,{const{password}=ctx.request.bodyconstmd5=crypto.createHash('md5')constpwd=md5.update(password).digest('hex')ctx.request.body.password=pwd等待下一个()}}module.exports=newRegisterMiddleWare()与数据库建立连接创建表结构CREATETABLEIFNOTEXISTS`user`(idINTPRIMARYKEYAUTO_INCREMENT,namevarchar(50)NOTNULLUNIQUE,passwordvarchar(200)NOTNULL,createAtTIMESTAMPDEFAULTCURRENT_TIMESTAMP,updateAtTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP);service/register.service.js中定义插入数据库的方法const=require('../app/database')classRegisterService{async){hasUserconst语句=`SELECT*FROMuserWHEREname=?`try{const[result]=awaitconnection.execute(statement,[name])returnresult.length}catch(error){console.log('LoginService-hasUser',error)}}asyncinsertUser(name,password){conststatement=`INSERTINTOuser(name,password)VALUES(?,?)`try{const[result]=awaitconnection.execute(statement,[name,password])returnresult}catch(error){console.log('LoginService-insertUser',error)}}}module.exports=newRegisterService()很多地方都需要用到与数据库的连接,所以在app/databse.js中统一建立连接池constmysql=require('mysql2')const{MYSQL_HOSTMSQL,_BYSQL,MYSQLMYSQL_USER,MYSQL_PASSWORD,}=require('./config')constconnection=mysql.createPool({数据库:MYSQL_DATABASE,主机:MYSQL_HOST,端口:MYSQL_PORT,用户:MYSQL_USER,密码:MYSQL_PASSWORD})connection.getConnection((conn)=>{conn.connect((err)=>{console.log(error,err)})})module.exports=connection.promise()数据库的账号密码直接连接硬编码写在代码中会存在问题,同样的写到.env文件中,通通过config.js导出//.envMYSQL_HOST=localhostMYSQL_PORT=3306MYSQL_DATABASE=mallMYSQL_USER=rootMYSQL_PASSWORD=123456APP_PORT=8000//config.jsconstdotenv=require('dotenv')dotenv.config()module.exports=ST,APP_MSQL_PORT,SQLMYSQL_DATABASE,MYSQL_USER,MYSQL_PASSWORD,}=process.env捕获错误注册账号时,用户已经注册或密码不符合规范,需要返回错误信息。在常数/错误型中定义常见错误消息constuser_already_exists='user_aldready_exists'constname_or_password_required='name_or_or_password_required_required'module.exports={user_aldready_exists,name_or_ord_pall_password_required_redire_ebrired_exirs_er_er_er_er_er_app/errorhandandandandandandandandandandandandandandandandandandandandandandandandandle}('../constants/error-types')consterrorHandle=(error,ctx)=>{letcode=200letmessage=''switch(error.message){caseUSER_ALREADY_EXISTS:message='用户已经存在'休息;}ctx.status=codectx.body=.message}mod=errorHandleapp/index.js引入路由定义的接口,获取post请求传递的参数,绑定错误处理方法constkoa=require('koa')常量应用程序=newKoa()constbodyParser=require('koa-bodyparser')constLoginRouter=require('../router/register.router')consterrorHandle=require('./error-handle')app.use(bodyParser())app.use(LoginRouter.routes())app.use(LoginRouter.allowedMethods())app.on('error',errorHandle)module.exports=app响应定义在controller/register.controller.js中对应的处理methodconst{insertUser}=require('../service/register.service')classRegisterController{asyncregister(ctx,next){const{name,password}=ctx.request.bodyconstresult=awaitinsertUser(name,password)ctx.body=result}}module.exports=newRegisterController()至此,我们就可以访问到接口了。以上就是注册一个接口的完整过程。不同的接口可能需要通过不同的中间件,比如登录接口需要验证密码,分发token。其他与用户权限相关的接口需要验证token。下面有几个相关的注释供参考。/koa)超详细的mysql总结(DQL)超详细的mysql总结(基本概念、DDL、DML)如何在nodejs中使用http创建服务