前面的話:在這裏已經提到了安裝node的方法,node是自帶npm的。我在技術中會用es6去編寫,而後下面會分別介紹node、pm二、express、mysql、sequelize。有少部分是摘抄大佬的內容,若有侵權,聯繫必刪。已更新。html
http://www.javashuo.com/article/p-tinbhllm-bw.html前端
下面會教你們怎麼去搭建一個後臺應用。vue
npm i //這個 i 是指install 安裝 npm -g //這個 -g是指全局安裝
NodeJs介紹node
套用官方的話就是:mysql
Node.js 是一個基於 Chrome V8 引擎的 JavaScript 運行環境。
Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。 git
ps:其實nodejs幾乎能實現任何的東西,可是沒有世界上最好用的語言,只有合適不合適。es6
nodejs中文網:http://nodejs.cn/github
基於 Node.js 平臺,快速、開放、極簡的 Web 開發框架web
Express安裝正則表達式
npm i -g express
安裝的express版本是4.0的,如今直接輸入express webtest,也會提示express不是內部命令,緣由是最新express4.0版本中將命令工具分家出來了,因此咱們還須要安裝一個命令工具,命令以下:
npm i -g express-generator
express中文文檔:http://www.expressjs.com.cn/4x/api.html
這裏的話用的是ejs的模板去搭建,由於前端顯示頁面是作不分離的項目,可是後臺管理的話是用vue全家桶去作,這裏的後臺搭建會在【vue三部曲】中的第二部講到。
按照這個下面的命令去作就能夠了
cd webtest //進入webtest文件夾 npm install //安裝所需依賴
npm start //npm啓動
express默認的端口是3000,在瀏覽器的地址欄打開http://127.0.0.1:3000/,成功以下圖顯示
express目錄介紹
這裏幾個執行的方法就不介紹了
// 代表是node可執行文件 #!/usr/bin/env node // 引入上面導出的app實例 var app = require('../app'); // 引入debug模塊,打印調試日誌 var debug = require('debug')('blog:server'); var http = require('http'); // 設置端口號 var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); // 啓動工程 var server = http.createServer(app); // 監聽端口號 server.listen(port); server.on('error', onError); server.on('listening', onListening);
// 生成一個express實例app var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var index = require('./routes/index'); var users = require('./routes/users'); var app = express(); // 設置views文件夾爲存放視圖文件的目錄,即存放模板文件的地方 // dirname爲全局變量,存儲當前正在執行的腳本所在的目錄 app.set('views', path.join(__dirname, 'views')); // 設置模板引擎爲ejs app.set('view engine', 'ejs'); // 加載日誌中間件 app.use(logger('dev')); // 加載解析json的中間件 app.use(bodyParser.json()); // 加載解析urlencoded請求體的中間件 app.use(bodyParser.urlencoded({ extended: false })); // 加載解析cookie的中間件 app.use(cookieParser()); // 設置public文件夾爲存放靜態文件的目錄 app.use(express.static(path.join(__dirname, 'public'))); // 路由控制器 app.use('/', index); app.use('/users', users); // 捕獲404錯誤,並轉發到錯誤處理器 app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // 盛傳環境下的錯誤處理器,將錯誤信息渲染error模板並顯示到瀏覽器中 app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; // 開發環境下的錯誤處理器,將錯誤信息渲染error模板並顯示到瀏覽器中 res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); // 導出app實例,供其餘模塊調用 module.exports = app;
// 生成一個路由實例用來捕獲訪問主頁的GET請求,導出整個路由並在app.js中經過app.use('/',routes);加載。 // 這樣,當訪問主頁時,就會調用res.render('index',{title:'Express'});渲染views/index.ejs模板並顯示到瀏覽器中 var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) {//首頁路由 res.render('index', { title: 'Express' });//render views視圖目錄下的index.ejs模板 }); // 導出路由實例 module.exports = router;
express安裝好以後,該安裝pm2了,剛剛那個npm start確定後面不會用的。這個命令能夠在packge.json中看到是npm啓動的方式,啓動了bin/www這個文件。不用這個命令去啓動是由於,須要啓動窗口一直開着,並且沒有熱更新,寫完代碼保存以後不會實施更新。好了,如今的話安裝全局的pm2
pm2介紹
• 內建負載均衡(使用 Node cluster 集羣模塊)
• 後臺運行 。
• 0 秒停機重載,維護升級的時候不須要停機。
• 具備 Ubuntu 和 CentOS 的啓動腳本 。
• 中止不穩定的進程(避免無限循環)
• 控制檯檢測
• 提供 HTTP API
• 遠程控制和實時的接口 API ( Nodejs 模塊,容許和 PM2 進程管理器交互 )
npm官網的pm2包:https://www.npmjs.com/package/pm2
npm i pm2 -g
pm2經常使用參數
-watch //監聽應用目錄變化,一旦發生變化,自動重啓。 -i -instances //啓動多少個實例,可用於負載均衡,若是-i 0或 -i max,則根據當前機器核數來肯定實例數目。 -ignore-watch//排查監聽目錄/文件,能夠是特定文件名,也能夠是正則。 -n -name//應用的名字,查看應用信息。 -o -output//標準輸出日誌文件路徑 -e -error//錯誤日誌文件輸出
pm2經常使用命令
pm2 list //列出pm2中的全部程序 pm2 logs //列出當前全部程序的web的日誌,能夠帶項目的id或者name,顯示指定程序的日誌 pm2 start bin\www //pm2啓動bin/www這個文件 pm2 stop 0//中止id爲0的程序,這裏不必定要用id也能夠是項目名稱name,而後能夠帶一個all中止所有程序 pm2 delete 0//刪除id爲0的程序,是刪除在pm2中運行的程序,同理這裏不必定要用id也能夠是項目名稱name,能夠帶一個all刪除所有程序 pm2 reload 0 //重啓id爲0的程序,同理這裏不必定要用id也能夠是項目名稱name,能夠帶一個all重啓全部程序 pm2 startup //建立開機自啓動命令
在這裏說明一下,我通常喜歡使用
pm2 start bin\www --name=webtest --watch //--name是能夠重命名程序顯示的名字 //--watch是實時預覽程序 //這一段代碼比較長,能夠把他放在package.json中的scripts中,用npm啓動的方式去啓動pm2程序
好了基本工具已經介紹完了。如今開始啓動嗨起來,對了還有一個 sequelize,一樣的安裝方式
squelize安裝
npm i sequelize //安裝以後引入使用可能會報mysql2的錯,注意這裏有個2,因此須要安裝mysql2 npm i mysql2
squelize介紹
Sequelize是一個基於promise的關係型數據庫ORM框架,這個庫徹底採用JavaScript開發而且可以用在Node.JS環境中,易於使用,支持多SQL方言(dialect),。它當前支持MySQL,、MariaDB、SQLite、PostgreSQL、Sql Server 數據庫。
目前在Node.js中,Sequelize的關注度較高,用的也較多。
由於是基於promise規範,在調用後的處理上再也不是callback方式,而是統一的鏈式調用方式,調用直觀,易讀。
開始
先把項目跑起來。
爲了方便,能夠建公共的頭部和底部使用include的方式把公共部分引入進來
而後效果就是這樣啦
建立其餘的路由頁面
如下是官方的一些路由實例
如下是基於字符串的路徑路徑的一些示例。 此路由路徑將匹配對根路由的請求,/。 app.get('/', function (req, res) { res.send('root') }) 此路徑路徑將匹配請求/about。 app.get('/about', function (req, res) { res.send('about') }) 此路徑路徑將匹配請求/random.text。 app.get('/random.text', function (req, res) { res.send('random.text') }) 如下是基於字符串模式的路徑路徑的一些示例。 此路徑路徑將匹配acd和abcd。 app.get('/ab?cd', function (req, res) { res.send('ab?cd') }) 這條路線的路徑將會匹配abcd,abbcd,abbbcd,等等。 app.get('/ab+cd', function (req, res) { res.send('ab+cd') }) 這條路線的路徑將會匹配abcd,abxcd,abRANDOMcd,ab123cd,等。 app.get('/ab*cd', function (req, res) { res.send('ab*cd') }) 此路徑路徑將匹配/abe和/abcde。 app.get('/ab(cd)?e', function (req, res) { res.send('ab(cd)?e') }) 基於正則表達式的路徑路徑示例: 此路徑路徑將匹配其中包含「a」的任何內容。 app.get(/a/, function (req, res) { res.send('/a/') }) 這條路線的路徑將匹配butterfly和dragonfly,但不butterflyman,dragonflyman等。 app.get(/.*fly$/, function (req, res) { res.send('/.*fly$/') })
這個是express的地址:http://www.expressjs.com.cn/guide/routing.html
咱們都知道全部能訪問的頁面都是get請求,因此通常用於seo前端渲染的模板上都是經過get路由去訪問的。
express寫接口
在這裏的話須要先安裝mysql數據庫了。能夠去mysql官網下一個mysql環境,個人系統是win10 64的,因此的根據本身的系統和須要的mysql版本下載安裝。這裏有點尷尬,我忘了我是怎麼裝的了。。。你們能夠搜一下win10安裝mysql的教程,仍是挺多的。
進入地址:https://dev.mysql.com/downloads/mysql/ 下載mysql-8.0.11-winx64
安裝好後控制檯輸入
mysqll -u root -p //回車而後輸入密碼就能夠了,須要注意的是,每次須要執行的mysql語句是要在結尾加上分號的。
或者你們也可使用可視化工具,這裏推薦的是Navicat for MySQL用着仍是很舒服的,不過新手的話建議仍是須要熟悉一下mysql語句的,好比我這種菜雞。
菜鳥教程的mysql教程:http://www.runoob.com/mysql/mysql-tutorial.html
show databases; //顯示全部數據庫 create database webtest;//建立名爲webtest的數據庫 use webtest;//選中webtest的數據庫
好吧。我以爲我仍是須要一個工具
新建一個表,裏面暫時是沒有數據的。能夠經過後面給出的方法作一個套增刪該查
下面是續更。。。
知識點:JS的模塊化
在寫nodejs操做數據庫以前,須要瞭解一些知識點。好比:js模塊化,而屬於js模塊化的標準有3個(CommonJS,AMD,CMD)
CommonJS
瀏覽器不兼容CommonJS的根本緣由,在於缺乏四個Node.js環境的變量。
AMD
最先的時候,全部的文件都是寫在一個js裏面,可是後面代碼越寫越多,而後就把代碼拆分出來不一樣的js。而這樣在瀏覽器去請求資源的時候,容易形成阻塞,因此誕生了require.js。require.js要求,每一個模塊是一個單獨的js文件。這樣的話,若是加載多個模塊,就會發出屢次HTTP請求,會影響網頁的加載速度。所以,require.js提供了一個https://requirejs.org/docs/optimization.html,當模塊部署完畢之後,能夠用這個工具將多個模塊合併在一個文件中,減小HTTP請求數。
CMD
玉伯是seajs的創始人,和AMD挺相近的。在 Sea.js 中,全部 JavaScript 模塊都遵循 CMD(Common Module Definition) 模塊定義規範。該規範明確了模塊的基本書寫格式和基本交互規則。在 CMD 規範中,一個模塊就是一個文件。
AMD和cmd的區別在於:SeaJS對模塊的態度是懶執行, 而RequireJS對模塊的態度是預執行。https://github.com/seajs/seajs/issues/277#issuecomment-19736961
題外話:我以爲我電腦要炸了。。。電腦好卡,下個sublimetext3繼續更。不知道爲何下載sublimetext3好慢,以前1秒鐘就下完了,如今幾十分鐘過去了。。還沒下好,只能繼續用vscode更了。。
好了。。步入正題。
先建立這2個文件夾 lib 和 module 。lib主要放一些配置文件,module主要放模塊化的文件。
先看一下數據庫,這裏就不搞那麼複雜了
數據庫配置信息 lib\db.js(database.js)
1 const Sequelize = require('sequelize');//引入sequelize依賴 2 3 const mysql = {//本地mysql庫信息配置 4 host: 'localhost',//地址 5 user: 'root',//用戶名 6 password: '1234',//密碼 7 database: 'webtest',//數據庫名 8 dialect: 'mysql'//數據庫類型 9 }; 10 11 const db = new Sequelize(mysql.database, mysql.user, mysql.password, { 12 host: mysql.host, 13 dialect: mysql.dialect, 14 operatorsAliases: false, 15 pool: { 16 max: 5,//最大鏈接池 17 min: 0, 18 idle: 10000 19 } 20 });//建立鏈接件程序 21 22 db.authenticate().then(function() { 23 console.log("數據庫鏈接成功"); 24 }).catch(function(err) { 25 //數據庫鏈接失敗時打印輸出 26 console.error(err); 27 throw err; 28 }); 29 30 module.exports = db;//導出
經過下面這段代碼測試是否鏈接成功。經過cd到這個lib目錄下,經過命令行node db.js去測試。
而後經過db.js去建立一個User的對象,sequelize的一些方法能夠看看中文文檔:https://itbilu.com/nodejs/npm/VkYIaRPz-.html
const sequelize = require('sequelize'); const db = require('../lib/db');//引入數據庫配置信息 const User = db.define('info', {//建立一個User對象,info是表名 id: { field: 'id',//對應數據庫的名字 primaryKey: true,//自增 type: sequelize.INTEGER,//類型 }, username: { field: 'username', type: sequelize.STRING(16), }, password: { field: 'password', type: sequelize.STRING(16), } },{ tableName: 'info',//表名 timestamps: true,//默認狀況下,Sequelize會將createdAt和updatedAt的屬性添加到模型中,以便您能夠知道數據庫條目什麼時候進入數據庫以及什麼時候被更新。請注意,若是您使用Sequelize遷移,則須要將createdAt和updatedAt字段添加到遷移定義中 freezeTableName: true// 默認false修改表名爲複數,true不修改表名,與數據庫表名同步 }); module.exports = User;
目前的話就先到這裏啦,各位晚安。。由於加班因此更新的會比較晚。。明天把前端ejs渲染的知識點和接口寫出來。。晚上cpu莫名的由於VS code飆升,更新今天的內容花了一個半小時。
各位新年快樂,過年期間發生了挺多事情的,今天開始繼續更啦。