標籤:

4.5 資料庫表-博客後端Api-NodeJs+Express+Mysql實戰

功能梳理完了以後,咱們就可以開始資料庫表設計了:

資料庫表圖:

首先打開Navicat Premium 創建資料庫 blog

配置如下:

在blogNodejs/models 下

首先新建 mysql.js 進行mysql連接配置(基於Sequelize)

var config = require(config-lite);//引入靈活配置文件nvar Sequelize = require(sequelize);.//引入Sequelizennvar Mysql = new Sequelize(config.mysql.database, config.mysql.user, config.mysql.password, {nthost: config.mysql.host, //資料庫伺服器ipntdialect: mysql, //資料庫使用mysqlntport: 3306, //資料庫伺服器埠ntpool: {nttmax: 5,nttmin: 0,nttidle: 10000nt},n});nnmodule.exports = Mysql;n

然後根據資料庫圖,依次創建對應的Model

這裡以user.js為示例 單獨說下:

/**n * User 用戶表n */nvar Sequelize = require(sequelize);//引入sequelizenvar Mysql = require(./mysql);//引入mysql實例化nn//定義User用戶表nvar User = Mysql.define(user, {ntuuid: {//使用uuid 而不使用ntttype: Sequelize.UUID,//設置類型nttallowNull: false,//是否允許為空nttprimaryKey: true,//主鍵nttdefaultValue: Sequelize.UUIDV1,//默認值nt}, //uuidntemail: { //郵箱ntttype: Sequelize.STRING,nttallowNull: false,nttunique: true, //唯一nttvalidate: {//設置驗證條件ntttisEmail: true,// 檢測郵箱格式 (foo@bar.com)ntt},nt},ntpassword: { //密碼ntttype: Sequelize.STRING,nttallowNull: false,nt},ntstate: { //狀態 0未激活郵箱、1已激活郵箱ntttype: Sequelize.STRING(2),//限制字元個數nttdefaultValue: "0", //默認值nt},n}, {ntfreezeTableName: true, //開啟自定義表名nttableName: User,//表名字nttimestamps: true, // 添加時間戳屬性 (updatedAt, createdAt)ntcreatedAt: createDate,// 將createdAt欄位改個名ntupdatedAt: updateDate,// 將updatedAt欄位改個名ntindexes: [{ // 索引ntttype: UNIQUE, //UNIQUE、 FULLTEXT 或 SPATIAL之一nttmethod: BTREE, //BTREE 或 HASHnttunique: true, //唯一 //設置索引是否唯一,設置後會自動觸發UNIQUE設置//true:索引列的所有值都只能出現一次,即必須唯一nttfields: [uuid], //建立索引的欄位數組。每個欄位可以是一個欄位名,sequelize 對象 (如 sequelize.fn),或一個包含:attribute (欄位名)、length (創建前綴字元數)、order (列排序方向)、collate (較驗的欄位集合 (排序))nt}],ntcomment:"User Table",//資料庫表描述n});nnmodule.exports = User;//導出n

表都寫完後,新建index.js

/**n * 資料庫表關係建立n */nvar Mysql = require(./mysql);nn//表nvar AdminUser = require(./adminUser);//管理員表nvar User = require(./user);//用戶表nvar UserInfo = require(./userInfo);//用戶信息表nvar Article = require(./article);//文章表nvar Category = require(./category);//文章類別表nvar Attachment = require(./attachment);//文章附件表nn/**n * 關係建立n */nn//用戶-用戶資料nUser.hasOne(UserInfo); //1:1nn//用戶-文章nUser.hasMany(Article); //1:NnArticle.belongsTo(User); //1:1nn//文章-分類 (定義中間表ArticleCategory 實現多對多)nArticle.belongsToMany(Category,{through: ArticleCategory}); //N:NnCategory.belongsToMany(Article,{through: ArticleCategory}); //N:Nnn//文章-附件nArticle.hasMany(Attachment); //1:NnAttachment.belongsTo(Article); //1:1nn//基於sequelize自動創建表//【!!注意 首次執行完請注釋掉該段代碼 !!】nMysql.sync({ntforce: true,//是否清空資料庫表n}).then(function() {ntconsole.log(ok);n});nnmodule.exports = {ntAdminUser: AdminUser,ntUser: User,ntUserInfo: UserInfo,ntArticle: Article,ntCategory: Category,ntAttachment: Attachment,n};n

好。到這裡,咱們咱們打開

blogNodejs/app.js 寫入以下代碼

/**n * 主入口啟動文件n * add by wwjn * 2017-08-24 15:01:48n */nvar express = require(express); //web 框架nvar logger = require(morgan); //開發模式下lognvar bodyParser = require(body-parser); //jsonnvar path = require(path); //路徑nvar config = require(config-lite); //讀取配置文件nvar winston = require(winston); //日誌nvar expressWinston = require(express-winston); //基於 winston 的用於 express 的日誌中間件nvar models = require(./models); //臨時添加 為了生成資料庫表,後面寫到Controllers裡面nn//實例化expressnvar app = express();nn// 設置模板目錄napp.set(views, path.join(__dirname, views));n// 設置模板引擎為 ejsnapp.set(view engine, ejs);nn// lognapp.use(logger(dev));nn//設置jsonn//格式化JSON的輸出napp.set(json spaces, 2);n// parse application/x-www-form-urlencodednapp.use(bodyParser.urlencoded({n extended: falsen}));n// parse application/jsonnapp.use(bodyParser.json());nn// 設置靜態文件目錄napp.use(express.static(path.join(__dirname, public))); //注意:中間件的載入順序很重要。如上面設置靜態文件目錄的中間件應該放到 routes(app) 之前載入,這樣靜態文件的請求就不會落到業務邏輯的路由里;nn//錯誤請求的日誌napp.use(expressWinston.errorLogger({n transports: [n new winston.transports.Console({n json: true,n colorize: truen }),n new winston.transports.File({n filename: logs/error.logn })n ]n}));nn// error handlernapp.use(function(err, req, res, next) {n // set locals, only providing error in developmentn res.locals.message = err.message;n res.locals.error = req.app.get(env) === development ? err : {};nn // render the error pagen res.status(err.status || 500);n res.render(error);n});nn//appnmodule.exports = app;n

執行一下

npm run devn

然後去mysql 下看看是否創建成功了

到這裡,咱們的資料庫已經ok啦, 下面開始進行後端路由設計啦

參考閱讀:

1、Sequelize 中文API文檔itbilu.com/nodejs/npm/V

2、Sequelize 和 MySQL 對照segmentfault.com/a/1190

3、使用Sequelizeliaoxuefeng.com/wiki/00

4、Sequelize API sequelize.readthedocs.io

上一節:4.4 功能梳理-博客後端Api-NodeJs+Express+Mysql實戰

下一節: 4.6 路由設計-博客後端Api-NodeJs+Express+Mysql實戰

推薦閱讀:

MySQL資料庫的高可用性分析
MySQL | AND運算符
MySQL成數據勒索新目標,開發4步自查
淺談如何對MySQL內核進行深度優化

TAG:Nodejs | MySQL |