Date: 2020-4-23
之前不多寫文章,從今天開始我要挑戰一下本身,連續輸出100篇技術類文章。這100篇文章我儘可能以實戰案例爲主。javascript
若是你以爲本文還不錯,記得關注或者給個 star,大家的贊和 star 是我編寫更多更精彩文章的動力!
GitHub 地址html
1.1 數據庫操做
// 使用 sequelize 代理數據庫操做 const { Sequelize, Model, DataTypes } = require('sequelize'); const config = require('./config') // 配置數據庫鏈接 const sequelise = new Sequelize( dbName, username, password, { host: host, dialect: 'mysql', // 配置方言 }) class User extends Model {} // 建立表 User.init({ username: DataTypes.STRING, birthday: DataTypes.DATE }, { sequelize, modelName: 'user' }); sequelize.sync() // 生成數據表 .then(() => User.create({ // 插入數據 username: 'janedoe', birthday: new Date(1980, 6, 20) })) .then(jane => { console.log(jane.toJSON()); });
1.2 MVC模式是什麼?
MVC即Model、View、Controller即模型、視圖、控制器 Module - 對象和業務邏輯 View - 用戶界面 Controller - 用來調度 View 和 Model
先來初始化下目錄結構:java
$ mkdir demo_001 && cd demo_001 $ npm init -y $ npm i -s nodemon better-npm-run $ npm i -s koa koa-views @koa/router koa-bodyparser $ npm i -s ejs sequelize mysql2
各個庫的版本號爲:
@koa/router: 9.0.0, better-npm-run: 0.1.1,ejs: 3.0.2,koa: 2.11.0,koa-views:6.2.1,sequelize:5.21.6,koa-bodyparser:4.3.0,koa-static:5.0.0,mysql2:2.1.0,nodemon:2.0.3
添加 npm scripts 到 package.json:node
"scripts": { "start": "npm run dev", "dev": "better-npm-run dev", "prd": "better-npm-run prd" }, "betterScripts": { "dev": { "command": "nodemon app.js", "env": { "NODE_ENV": "development" } }, "prd": { "env": { "NODE_ENV": "production" }, "command": "pm2 start app.js -n demo_001" } },
新建 app.jsmysql
// app.js 代碼 const Koa = require('koa'); const views = require('koa-views'); const path = require('path'); const bodyparser = require('koa-bodyparser'); const app = new Koa(); app.keys = ['my keys']; app.use(bodyparser()); app.use(views(path.join(__dirname, './views'), { extension: 'ejs' })); app.listen(3000, () => { console.log('server is running', new Date()); });
讓代碼跑起來,以後修改代碼不用頻繁的重啓服務。由於開發環境是用 nodemon 託管的git
$ npm start
新建 views 目錄結構github
demo_001 ├── router │ └── index.js ├── views │ ├── index.ejs │ ├── header.ejs │ ├── create.ejs │ └── edit.ejs └── app.json └── package.json
view 層核心代碼:sql
<!-- views/header.ejs --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>node + mysql 實現增刪改查</title> </head> <body>
<!-- views/index.ejs --> <% include('./header.ejs') %> <h1> <%= title %> <small>實現增刪改查</small> </h1> <a href="/user/create">添加用戶</a> <style> table{ border-color: #ccc; } table td, th{ background: #fff; } </style> <table cellspacing="1" cellpadding="15" bgcolor="#000" > <thead> <tr> <th>username</th> <th>pwd</th> <th>phone</th> <th>age</th> <th>gender</th> <th>操做</th> </tr> </thead> <% for (const user of users) { %> <tr> <td><%= user.username %></td> <td><%= user.pwd %></td> <td><%= user.phone %></td> <td><%= user.age %></td> <td><%= user.gender %></td> <td> <a href="/user/edit?id=<%= user.id %>">修改</a> <a href="/user/del/<%= user.id %>">刪除</a> </td> </tr> <% } %> </table> </body> </html>
<!-- views/create.ejs --> <% include('./header.ejs') %> <style> label{ width: 80px; display: inline-block; text-align: right; padding-right: 10px; } </style> <h1> <%= title %> <small><a href="/">返回首頁</a></small> </h1> <form action="/user/create" method="POST" > <fieldset> <label>username</label> <input value="" name="username" /> </fieldset> <fieldset> <label>pwd</label> <input value="" name="pwd" /> </fieldset> <fieldset> <label>phone</label> <input value="" name="phone" /> </fieldset> <fieldset> <label>age</label> <input value="" name="age" /> </fieldset> <fieldset> <label>gender</label> <input value="" name="gender" /> </fieldset> <fieldset> <button type="submit">Submit</button> </fieldset> </form> </body> </html>
<!-- views/edit.ejs --> <% include('./header.ejs') %> <style> label{ width: 80px; display: inline-block; text-align: right; padding-right: 10px; } </style> <h1> <%= title %> <small><a href="/">返回首頁</a></small> </h1> <form action="/user/edit" method="POST" > <input value="<%= user.id %>" name="id" type="hidden" /> <fieldset> <label>username</label> <input value="<%= user.username %>" name="username" /> </fieldset> <fieldset> <label>pwd</label> <input value="<%= user.pwd %>" name="pwd" /> </fieldset> <fieldset> <label>phone</label> <input value="<%= user.phone %>" name="phone" /> </fieldset> <fieldset> <label>age</label> <input value="<%= user.age %>" name="age" /> </fieldset> <fieldset> <label>gender</label> <input value="<%= user.gender %>" name="gender" /> </fieldset> <fieldset> <button type="submit">Submit</button> </fieldset> </form> </body> </html>
路由部分核心代碼:數據庫
const Router = require('@koa/router'); const router = new Router() // 首頁,查詢全部用戶 router.get('/', async ctx => { let users = [] console.log('查詢全部用戶') await ctx.render('index', { title: 'node + mysql ', users }); }); // 增長 router.get('/user/create', async ctx => { await ctx.render('create', { title: '添加用戶', method: 'add' }) }) router.post('/user/create', async ctx => { console.log('添加用戶:',ctx.request) ctx.redirect('/') }) // 修改 router.get('/user/edit', async ctx => { const codition = { id: ctx.query.id } console.log('查詢要修改的用戶',codition) await ctx.render('edit', { title: '修改用戶', method: 'edit', user: {} }) }) router.get('/user/edit', async ctx => { console.log('要修改的用戶:', ctx.request) ctx.redirect('/') }) // 刪除 router.get('/user/del/:id', async ctx => { console.log('刪除用戶id,', ctx.params.id) ctx.redirect('/') }) module.exports = router;
目前爲止全部的路由已經準備好了,須要掛載到 koa 實例上npm
// 修改 app.js // 引入路由部分 const indexRouter = require('./router/index') // 掛載到 koa 實例 app.use(indexRouter.routes(), indexRouter.allowedMethods());
到這一步咱們已經把頁面作好了
打開瀏覽器輸入 http://localhost:3000
到此爲止,頁面已經能夠訪問了
新建 module 目錄結構
demo_001 ├── config │ ├── dev.js │ ├── prd.js │ └── index.js ├── modules │ └── user.js ├── router ├── views ├── db.js ├── app.json └── package.json
咱們先要配置數據庫鏈接:
// config/index.js if (process.env.NODE_ENV === 'production') { module.exports = require('./prd') } else { module.exports = require('./dev') }
dev 和 prd 分別對應不一樣環境的數據庫鏈接。這裏都寫成你本身的數據庫地址便可
// config/prd.js, config/dev.js module.exports = { db: { // host host: '127.0.0.1', // 數據庫名 dbName: 'xxxx', // 用戶名 username: 'xxxx', // 密碼 password: 'xxxx' } }
鏈接數據庫 db.js
// db.js const Sequelize = require('sequelize'); const config = require('./config') const { dbName, username, password, host } = config.db; const sequelise = new Sequelize( dbName, username, password, { host: host, dialect: 'mysql', // 配置鏈接池 pool: { max: 5, min: 0, acquire: 30000, idle: 10000 } }) sequelise .authenticate() .then(() => { console.log('數據庫鏈接成功') }) .catch(err => { throw new Error('數據庫鏈接失敗', err) }) module.exports = sequelise
建立 module
// modules/user.js const Sequelize = require('sequelize') const sequelize = require('../db'); const User = sequelize.define('user', { username: { type: Sequelize.STRING }, pwd: { type: Sequelize.STRING, }, phone: { type: Sequelize.STRING, }, age: { type: Sequelize.STRING, }, gender: { type: Sequelize.INTEGER, }, }); module.exports.add = async (data) => await User.create(data) module.exports.del = async (id) => await User.destroy({ where: { id } }) module.exports.update = async (data) => { let newUser = {...data} delete newUser['id'] return await User.update({ ...newUser }, { where: { id: data.id } }) } module.exports.find = async (condition) => { if (Object.keys(condition).length) { return await User.findAll({ where: { ...condition } }) } else { return await User.findAll(); } }
如今要通 修改 過路由,把視圖和 module 結合起來。
// router/index.js // 引入 const UserMudule = require('../modules/user') // 修改路由:增長 router.post('/user/create', async (ctx) => { const { username, pwd, phone, age, gender } = ctx.request.body await UserMudule.add({ username, pwd, phone, age, gender }) ctx.redirect('/') }) // 修改路由:首頁,查詢全部用戶 router.get('/', async ctx => { let users = await UserMudule.find(ctx.query) await ctx.render('index', { title: 'node + mysql ', users }); });
此時已經實現了增長和查詢,你能夠測試一下這部分功能。
接下來實現修改和刪除的代碼
// router/index.js // 修改路由:delete router.get('/user/del/:id', async ctx => { await UserMudule.del(ctx.params.id) ctx.redirect('/') }) // 修改路由:update router.get('/user/edit', async ctx => { const codition = { id: ctx.query.id } // 修改前先查詢出 User 對象 let user = await UserMudule.find(codition) await ctx.render('edit', { title: '修改用戶', method: 'edit', user: user[0] }) }) // 修改路由:update router.post('/user/edit', async ctx => { const { username, pwd, phone, age, gender, id } = ctx.request.body // 接受參數,執行修改 await UserMudule.update({ id, username, pwd, phone, age, gender }) ctx.redirect('/') })
來,測試一下!
到此你已經掌握了簡單的 nodejs 服務器開發,下一篇文章我繼續帶你一步步的上線一個 nodejs 項目
因此,若是你看完真以爲不錯,那就給個 star 吧!你的贊和 star 是我編寫更多精彩文章的動力GitHub 地址
這篇文章我花了6個小時,寫代碼,錄gif 脖子和胳膊都酸了~~
但願小夥伴們給我一點點打賞,鼓勵我寫成更多幹貨文章