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

从搭建项目到实现API

时间:2023-04-03 13:15:29 Node.js

koa2,我从来没有接触过koa2。我只知道是express原班人马开发的。它在某些方面比表达更好。经历了从koa到koa2的升级。应该说是比较成熟了。按照目前的技术实现方案,大部分的web服务基本都是前后端分离的,所以koa2让web应用的开发和API的使用变得更加简单,更值得我们去学习。本文仅简单介绍一下如何搭建环境,让初次学习koa或web应用的同学能更快看到学习成果,增加学习的自信心。我们会补充其中涉及的很多知识点和技术点。这篇文章解释的太多了,本文的目的是普及知识。本文部分代码可能是从网上抄来的,但都是手工调试运行的,以保证代码的正常运行。想都没想就安装node吧。考虑一下,koa项目是基于node的,话不多说,先安装node。但这里有一个细节需要注意。Node最低要求7.6.0版本,主要是一些es6语法支持。brewinstallnode这里我在mac环境下安装了node。由于我习惯使用homebrew安装,如果不是mac环境的学生,也可以直接从官网下载安装包安装。这一步比较简单。一般直接看官网文档就可以搞定。node安装完成后,查看node的版本有两个目的,一是查看node是否安装成功,二是查看是否满足koa的版本要求。node-vnpm-vnpm集成到node中,只要node安装成功,npm也会安装成功。安装koa,我们学习和应用的是koa项目,所以我们先安装koa。npminstallkoa--save安装koa2工程生成器并创建工程npminstallkoa-generator-gkoa2bbs这里的koa-generator不是官方的工程生成器,而是狼叔-桑石龙贡献的财富,在此,我们感谢狼叔叔。koa2bbs,这行代码创建了一个基于koa2的项目,并生成了一个基本的项目架构。基本项目结构如下:安装依赖项目也创建了,但是只完成了一个基本的骨架,没有血肉。接下来,您需要安装项目的依赖项。cdbbsnpminstall这一步可能会花很长时间,这和网络环境有关。由于网络原因,部分依赖可能会安装失败。这时候我们可以通过修改npm镜像来减少由于网络环境导致无法安装依赖的问题。详情请参考淘宝NPM镜像。启动服务npmstartnpm可以启动服务,但不支持热更新。我们只是测试项目能否正常启动、执行、热更新。我们稍后再谈。服务正常启动后,在浏览器中输入:localhost:3000,如果页面显示“HelloKoa2”等内容,则表示项目构建成功。构建项目这里的构建项目并不是用koa2初始化一个项目,而是给koa2初始化的项目补充营养,让它变得丰满。安装sequelize,不用管sequelize是什么。以后会有专题。你只需要了解一点:Sequelize是一个基于promise的nodejsORM,目前支持Postgres、mysql、SQLite和MicrosoftSQLServer。具有强大的事务支持、关联关系、读取和复制等功能。npminstallsequelize--saveinstallmysql,mysql2项目需要mysql数据库支持用于创建mysql数据库连接。constSequelize=require('sequelize');constsequelize=newSequelize('dbname','dbusername','password',{host:'localhost',dialect:'mysql',operatorsAliases:false,dialectOptions:{//字符集charset:'utf8mb4',collat??e:'utf8mb4_unicode_ci',supportBigNumbers:true,bigNumberStrings:true},pool:{max:5,min:0,acquire:30000,idle:10000},timezone:'+08:00'//东部八分之一时区});module.exports={续集};这些代码可以直接使用,只需要将代码中实例化Sequelie对象语句中的dbname改成你的数据库名,dbusername改成你的数据库用户名,passoword改成你的数据库密码,这里数据库名和数据库用户名不能为空,密码可以为空,如果为空,则为空字符串。constsequelize=newSequelize('bbs','root','',{...创建schema,modules,controllersschema:数据表模型实例modules:实体模型controllers:在controllers的3个目录下创建article.js.schema数据表模型在schema目录下新建article.js文件,这个文件的主要作用是与数据表建立对应关系,也可以理解为码表的创建。首先分析一下表结构:字段描述需要填写id文章自增ID,主键没有,自动填写的title文章标题是作者,作者是内容,文章内容是分类,而文章分类就是分析表结构,主要是建表,表结构就是我们根据实体关系抽象出来的实体关系,根据这些关系建立表,表中存储实体关系。创建表有两种方法:一种是使用mysql数据库的命令行工具或者UI工具来创建表,另一种是使用我们前面介绍的Sequelize让程序创建表。使用mysql工具建表:DROPTABLEIFEXISTS`article`;CREATETABLE`article`(`id`int(11)NOTNULLAUTO_INCREMENT,`title`varchar(255)NOTNULL,`author`varchar(255)NOTNULL,`content`varchar(255)NOTNULL,`category`varchar(255)NOTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=7DEFAULTCHARSET=utf8;SETFOREIGN_KEY_CHECKS=1;这是使用sql语句建表的方式,我们再来看另一种用Sequelize建表的方式(Sequelize不仅可以建表,还可以管理数据库);我们刚才在schema目录下创建的article.js是用来创建数据表模型的。也可以理解为创建数据表,代码如下:constmoment=require("moment");module.exports=function(sequelize,DataTypes){returnsequelize.define('article',{id:{type:DataTypes.INTEGER,primaryKey:true,allowNull:true,autoIncrement:true},//文章标题title:{type:DataTypes.STRING,allowNull:false,field:'title'},//作者author:{type:DataTypes.STRING,allowNull:false,field:'author'},//content内容:{type:DataTypes.STRING,allowNull:false,field:'content'},//文章分类类别:{type:DataTypes.STRING,allowNull:false,field:'category'},//创建时间createdAt:{type:DataTypes.DATE},//更新时间updatedAt:{type:DataTypes.DATE}}},{/***如果为true,名称与模型相同,即user*如果是fasle,mysql创建的表名会是复数,即users*如果指定的表名本身是复数,则表格不会改变*/freezeTableName:true});}模型应用,在项目的modules目录下使用创建一个article.js文件作为文章表,它是一篇文章的实例//导入mysql配置文件constdb=require('../config/db');//导入sequelize对象constSequelize=db.sequelize;//导入数据表模型constArticle=Sequelize.import('../架构/文章');Article.sync({force:false});//自动创建表classArticleModel{/***创建文章模型*@paramdata*@returns{Promise<*>}*/staticasynccreateArticle(data){returnawaitArticle.create({title:data.title,//标题作者:data.author,//作者内容:data.content,//文章内容分类:data.category//文章分类});}/***查询文章详情*@paramid文章ID*@returns{Promise}*/staticasyncgetArticleDetail(id){returnawaitArticle.findOne({where:{id}});}}module.exports=ArticleModel;controllerController控制器的主要作用是处理函数。在项目的controller目录下创建article.js。代码如下:constArticleModel=require("../modules/article");classarticleController{/***创建文章Chapter*@paramctx*@returns{Promise.}*/staticasynccreate(ctx){//接收客服端letreq=ctx.request.body;if(req.title&&req.author&&req.content&&req.category){try{//创建文章模型constret=awaitArticleModel.createArticle(req);//使用刚刚创建的文章ID查询文章详情,返回文章详情constdata=awaitArticleModel.getArticleDetail(ret.id);ctx.response.status=200;ctx.body={code:200,msg:'文章创建成功',data}}catch(err){ctx.response.status=412;ctx.body={code:412,msg:'创建文章失败',data:err}}}else{ctx.response.status=416;ctx.body={代码:200,msg:'参数不完整'}}}/***获取文章详情*@paramctx*@returns{Promise.}*/staticasyncdetail(ctx){letid=ctx.params.id;if(id){try{//查询文章详情模型letdata=awaitArticleModel.getArticleDetail(id);ctx.response.status=200;ctx.body={code:200,msg:'查询成功',data}}catch(err){ctx.response.status=412;ctx.body={code:412,msg:'Queryfailed',data}}}else{ctx.response.status=416;ctx.body={code:416,msg:'ArticleIDmustbepassed'}}}}module.exports=articleController;Routing路由也可以简单理解为路径,主要是作为请求的url,请求的路径处理一些请求和返回数据一般来说,对于基于节点的项目,路由在一个名为routes的目录下。constRouter=require('koa-router');constArtileController=require('../controllers/article');constrouter=newRouter({prefix:'/api/v1'});/***文章界面*///创建文章router.post('/article/create',ArtileController.create);//获取文章详情router.get('/article/:id',ArtileController.detail)module.exports=routerstart这里的服务主要是测试服务能否正常启动,能否正常运行。npmstart如果启动过程中出现下面的结果,说明服务启动成功?bbsnpmstart>bbs@0.1.0start/usr/local/var/www/koa/bbs>nodebin/wwwkoadeprecated对生成器的支持将被删除在v3.有关如何转换旧中间件的示例,请参阅文档https://github.com/koajs/koa/blob/master/docs/migration.mdapp.js:20:5IgnoringinvalidconfigurationoptionpassedtoConnection:collat??e。目前这是一个警告,但在MySQL2的未来版本中,如果将无效的配置选项传递给Connection,则会抛出错误,忽略传递给Connection:collat??e的无效配置选项。目前这是一个警告,但在MySQL2的未来版本中,如果您将无效的配置选项传递给ConnectionExecuting(默认),则会抛出错误:CREATETABLEIFNOTEXISTS`article`(`id`INTEGERauto_increment,`title`VARCHAR(255)NOTNULL,`author`VARCHAR(255)NOTNULL,`content`VARCHAR(255)NOTNULL,`category`VARCHAR(255)NOTNULL,`createdAt`DATETIME,`updatedAt`DATETIME,PRIMARYKEY(`id`))ENGINE=InnoDB;Executing(default):SHOWINDEXFROM`article`接下来就可以测试界面了。我用来测试界面的工具是postman以前postman好像是作为浏览器插件存在的,现在已经不是浏览器插件了,直接做成应用程序,可以下载直接从postmna官方网站。官网地址是https://www.getpostman.com/,然后我们可以根据自己的系统平台选择合适的版本下载。解决跨域和跨域是web开发中必然要解决的问题。跨域问题主要是解决服务器端的通信问题。在node的开发中,只需要实现一个CORS标准即可。npminstallkoa-cors--save并在根目录添加koa-cors对app.js的引用:constcors=require('koa-cors')app.use(cors())//使用cors并重启Serve。目前还不支持热更新,现在主要测试功能,暂时手动重启,后面会有专题介绍热更新服务。在测试接口之前,我下载并安装了postman,工具可用,代码层面也做好了解决跨域问题的准备。接下来,我可以测试接口是否可用。测试接口,我们先看一下我们路由管理文件routes目录下的index.js文件。//创建文章router.post('/article/create',ArtileController.create);//获取文章详情router.get('/article/:id',ArtileController.detail)这里有2个文章相关的接口,一是新建文章,二是获取文章详情。让我们先测试创建一篇新文章。看路由,需要新建文章的请求方法是post,url是/article/create,所以我们根据这个信息使用postman来测试一下。这是我的新建文章接口测试,再看测试结果:运行结果告诉我们,新建文章接口测试成功,说明这个接口可以通过。如果我们现在是前后端分离的开发模式,需要提供api,那么这个api可以提供给前端同学使用。我们还可以从数据库验证执行结果的正确性:数据已经成功插入数据库,进一步验证了我们接口的正确性和可执行性,这个接口到此结束。然后看下一个获取文章详情的界面。需要使用get请求方式,请求的URL为/article/:id。总结至此,我们基本完成了从0开始搭建一个koa项目,完成了一些简单的API接口的实现。当然,这只是最基本的实现,还有很大的优化空间。对于初学者来说,适可而止。对于有深入了解或学习的朋友,希望大家一起学习提高。