node写一个接口全过程

写前端的朋友不知道如何拓展自己在后端的能力,那么nodejs是你的不二选择,废话不多说,直接进入正题。

这里我演示的是nodejs+mysql,别的数据库也类似。

首先我们需要做两件事,下载nodejs和mysql安装,这些基本知识略过。

接着新建一个文件夹,在此文件夹下打开cms,或者vscode的终端,输入node init初始化一个项目,输入一些基本信息。

然后我们我们还需要安装以下包到--save下

image

express和mysql这两个包是最主要的,稍后再讲其他包的作用。

在这里我要阐明一个事实,这里的mysql是操作mysql数据库的一个js插件,并不是数据库软件,npm下载的包都是一些js的插件包。

好了,接下来和我一步步向下操作就可以了。

在文件夹下新建一个index.js文件,当然别的名字也可以,这个文件是你整个程序的入口。

键入以下代码:

image

80代表的是你的端口号,然后在终端或者cms输入node index.js,在浏览器里打开localhost就可以看到了,或者127.0.0.1也行,如果是别的端口号需要加上端口号,当然现在是什么也没有,因为我们还没有写接口。

接下来我们写一个get接口,返回一个‘hello world’字符串

image

res.json这个方法是以json对象的形式返回去,还有以下方法

res.send以页面的方式返回去

res.download以文件的方式返回去,前端请求会下载此文件

别的方法这里就不在一一阐明了,可以打出res.然后使用vscode的语法提醒查看下面的方法即可,或者查看文档看解释。

image

接下来我们返回一个页面:

image

可以看到localhost页面上出现了我们预期的结果

image

到了这里想必你们已经发现问题了,我每次改动一下都要重新跑程序,这不符合人体工程学,说的一点没错,我无法容忍,你萌呢?

想必你们在前面也发现了pageage.json里有这么一句话

image

scripts的作用就是自己定义脚本命令,在这下面定义的所有命令都可以使用npm run xxx来运行,可以省略run。里面运行的应该是node index.js才对,但是这里我们使用了一个插件,hotnode,这个插件可以让你的node程序热更新,要全局安装这个插件,不然找不到命令。

npm install -g hotnode

然后我们就可以npm start运行我们的程序了,所有基于node的程序跑起来都是两步,npm install,安装所有插件,npm start运行程序,如果跑不起来,那么这个项目一定不是一个好项目,我通常如此告诫我的弟子,我们一定要站在巨人的肩上。

做到这里,我们接下来就可以愉快的开发了。

接下来我们试试post方法

image

post不支持浏览器直接访问,这个时候要用postman软件

image

依然符合我们的预期。

可以把路径改为/login,/test进行尝试,这里就不再演示了。

也可以试试app.all方法,这个方法支持所有请求方式,不必每个请求都写好几遍了。

想必大家已经想到了,我要做登录拦截难道每个接口里都要写一遍吗。

答案是当然不用的,接口的第一个参数可以用正则表达,我们这么写:

image

我们使用来匹配所有路径,这个时候请求test,会先经过,被拦截返回了**,

我们可以在内部判断来进行操作:

image

如果未登录,返回未登录,否则,继续向下匹配,回调函数接收三个参数,最后一个是next,继续向下执行,路径一定要写在最上面,不然会先被test捕捉到,test没有执行next,就会捕捉不到请求。

这时候就可以设置login的值来看路径localhost/test下的返回值了。

那么有参数的情况呢,我们先引入一下中间件,如果没有安装可以先npm安装

image

接下来我们请求一下

image

?后面的表单参数会放到req.query里,路径上的参数会放到req.params里,json参数会放到req.body里,可以任意选择一种参数传递即可,路径以:开头表示此路径作为参数的意思。

前后端联调的时候经常碰到跨域的问题,我们可以使用cors插件解决,

image

以上提到的跨域和参数都可以自己进行处理,利用路径自己提取参数,在*路径的请求的请求体req里自己加上跨域允许的header,但我希望你们可以使用插件,保证代码的简洁性,同时

我经常告诉我的弟子,我们一定要站在巨人的肩上。

好了,接下来我们开始连接数据库,从数据库里拿一条数据出来返回给前端。

引入mysql插件,我们先在mysql里新建一个表students,存入以下数据:

image

然后使用mysql插件连接数据库

image

option里都是连接数据库的基本配置,更多参数可以查看文档,我们请求一下localhost/login看看

image

真的返回了我们存在数据库的数据,我好激动啊,大业终于完成了。

是的,conn.query就是执行一条sql语句,在回调函数里返回结果。

结果可以用构造函数封装,这样就不用每次都写一推没用的字段了。

如果你在此处这样做:

image

那么这个不妥的,第一次没有问题,第二次不行了,说是关闭了数据库无法继续查询,因为connect()并不能重连数据库,你需要重新建立一条新连接,所以不建议使用conn.end()断开数据库。

如果莫名其妙断了呢,我们就需要就重连机制,断了数据库会触发error事件,我们这样处理:

image

监听error事件,如果err.code返回了以上字符,那么我们就重新发起连接,直到连接成功。

做到这里,想必大家已经想到了,这是单线程的,并发量高的时候会不会顶不住,会的,所以我们要上连接池。

连接池与连接相似,做以下处理:

image

建立连接池比连接多了几个参数,这里罗列了常用的三个,其它参数可以查看文档。箭头处多处理了一下断线重连,我在服务里关掉mysql服务再打开测试了一遍,功能正常、这个时候我们使用连接池处理请求。conn.release()的意思是释放连接池的意思,用完就要释放给别的请求使用,也可以直接使用连接池,具体区别我还不知道,我猜应该是直接使用连接池就是这个线程专门为这个请求服务,不用别的也不释放,可以用于常用接口,可以减少取连接池的操作。

做到这里我们大部分工作已经做完了,想必大家一定又想到了什么,我如果有一千个接口,难道要在一个文件里写一千个吗。

这当然是不妥的,比较难维护,所以我们要拆分模块,使用express.Router()这个api。

我们将连接数据库的文件单独抽离

image

导出常用的pool,Result,router,app模块,然后在子模块:

image

然后在入口:

image

看看是不是简洁多了,要注意一点,引入的子模块要放到全局监听的下面,不然又会无法匹配到,app.use的第一个参数代表下发到那个目录,内部子模块的/相当于app.use的第一个参数,express()和express.Router()的区别是,router比较小,可以作为中间件。接下来请求一下/和/login试试吧。

资源附上

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容