趁着空閑一兩天,趕緊學習一下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
搞到這里,其實只要運行起來,前端就已經可以調用了
再貼一下數據庫的內容,只不過數據庫這塊我還有太多不懂,要學習的東西還太多