如何使用node做后台接口开发
趁着空闲一两天,赶紧学习一下node,不然又要忘记了。今天完成了一个接口,自己用前端请求也是成功的,记录一下。
首先看一下整体的目录,最简单的了,后面再学习到内容肯定要再优化
其中,app.js是项目的入口,connect.js是统一用来连接数据库的方法,api文件下面的index.js用来存接口地址和名字,api文件下面的文件就用来区分项目模块,获取数据库数据然后导出
项目开始之前要先安装nodejs+mysql,创建一个项目文件夹,在文件夹中打开命令行工具,输入npm init初始化一个项目,然后输入一些基本信息
得到的package.json文件中,需要安装一下下面这几个依赖包,后面会说到每个的用处
接下来就是直接贴代码了。
首先从app.js文件入手,这是一个入口文件,里面可以做全局拦截,接口的处理,监听端口,
app.js
const { app, pool, Result } = require('./connect') const api = require('./api/index') app.all('*', (req, res, next) => { //处理全局拦截 next() }) app.all('/', (req, res) => { pool.getConnection((err, conn) => { console.log(11) res.json({ a: 'b' }) conn.release() //释放连接池,等待别的链接使用 }) }) //遍历添加接口 api.map(item=>{ app.use(item.title,item.url) }) app.listen(82, () => { console.log('服务启动') })
然后说一下connect.js文件,上面有提到这个是用来连接数据库的,那肯定就少不了一些数据库的配置信息,其中用了node的express框架,里面的mysql并不是我们的数据库,只是用来连接数据库的一个包,然后cors包食用来解决跨域问题的,其他就不细说了。直接上代码
connect.js
const express = require('express') const mysql = require('mysql') const cors = require('cors') const bodyParser = require('body-parser') //解析参数 const app = express() const router = express.Router() //数据库基本配置信息 const option = { host: 'localhost', user: 'root', password: 'root', port: '3306', database: 'test', connectTimeout: 5000, //连接超时 multipleStatements: false, //是否允许一个query中包含多条sql语句 } app.use(cors()) //解决跨域 app.use(bodyParser.json()) //json请求 app.use(bodyParser.urlencoded({ extended: false })) //表单请求 app.listen(81, () => console.log('服务启动')) let pool //建立重连机制 repool() function Result({ code = 1, msg = '', data = {} }) { this.code = code this.msg = msg this.data = data } function repool() { pool = mysql.createPool({ ...option, waitForConnections:true,//当唔连接池可用时,等待(true)还是报错(false) connectionLimit: 100,//连接数限制 queueLimit:0//最大连接等待数(0为不限制) }) //监听error事件,如果err.code返回了以下字符串,那么我们就重新发起连接 pool.on( 'error', (err) => err.code === 'PROTOCOL_CONNECTION_LOST' && setTimeout(reconn, 2000) ) } module.exports={pool,Result,router,app}
然后说到api文件,api文件下的index.js文件,上面说到是用来存放接口地址和名字的,现在只写了一个,后面肯定还有很多,很多的时候,这个就会很大,这里肯定还是需要优化的,可是目前没有想到比较好的方法,所以就先这样做。这里到处了一个api数组,在app.js文件中进行导入添加
api---index.js
const api = [ { url:require('./apiModule/login/index'), title:'/login' } ] module.exports=api;
然后就看一下api文件下的apiModule文件,想法是要把整个项目按照模块区分,然后一些查询语句及信息就写在里面,这里就写了一个login文件下的index.js文件,
api---apiModule---login---index.js
const { pool, router, Result } = require('../../../connect') router.all('/', (req, res) => { pool.getConnection((err, conn) => { //从连接池中哪一个连接 conn.query('SELECT * FROM students', (e, r) => { let arr = r; let obj = { name: '小刘', sex: '男', age: 24, address: '北京', id: 7 } arr.push(obj) res.json(new Result({ data: arr })) }) conn.release() //释放连接池 }) }) module.exports = router
可以看到上面写的是一个查询语句,至于中间部分问什么要插入一条数据,其实只是我自己为了测试一下更改数据库返回的信息。可以直接去掉的。
然后上面安装的依赖包基本有用到了,还有一点差点被我忽略了,就是我们更改东西之后,如果每次都运行一下,那就很麻烦了,所以package.json中有一个依赖包就是用来解决这个问题的----hotnode,在package.json文件中添加一个自定义命令npm start
搞到这里,其实只要运行起来,前端就已经可以调用了
再贴一下数据库的内容,只不过数据库这块我还有太多不懂,要学习的东西还太多