[toc]javascript
在node中有一個全局變量,globar
,裏面掛載了不少的方法,在使用的時候不須要加前綴,即可直接使用css
例如:html
Koa 是一個新的 web 框架
。 經過利用async
函數,Koa 幫你丟棄回調函數,並有力地加強錯誤處理。 Koa 並無捆綁任何中間件, 而是提供了一套優雅的方法,幫助您快速而愉快地編寫服務端應用程序。前端
koa中主要是中間件:洋蔥模型 原理:
dispatch
,compose
java
koa腳手架的安裝流程
node
koa-generator
$ npm install -g koa-generatorgit
koa-generator
生成koa2項目$ koa2 -e project(項目名稱) (-e 表明使用模板引擎ejs | -a 表明art模板 )es6
參考文檔web
安裝:redis
npm i koa
建立一個服務
安裝
npm i koa-router
配置
let router = require("koa-router")(); //引入router並進行實例化
//啓動路由 app.use(router.routes()); app.use(router.allowedMethods());
示例
安裝
npm install koa-compose
做用
多箇中間件合併成單一中間件,方便重用和導出
示例
安裝
npm i koa-bodyparser
配置
//配置Post提交數據的中間件 app.use(bodyparser());
或者可指定配置低的類型
app.use ( bodyparser ({ enableTypes: [ 'json' , 'form' , 'text' ] }) );
示例
安裝
npm i koa-static
配置
//託管靜態資源 app.use(static(__dirname+"/public"));
示例
通常狀況下:
koa2----art模板
|express---ejs模板
安裝
npm i koa-views
配置
app.use( views( __dirname + '/views', { extension: 'art' //模板後綴,能夠是 art、ejs、html.... }));
示例
安裝
npm i koa-art-template
配置
//配置模板引擎 render(app, { root: path.join(__dirname, 'views'), //模板引擎的存放的位置 extname: '.art', //模板的後綴 //判斷當前環境,若爲開發環境有debug,反之再也不有debug模塊 debug: process.env.NODE_ENV !`` 'production' });
示例
安裝
npm i silly-datetime
配置
return sd.format(time,"YYYY-MM-DD HH:mm:ss");
模板中的簡單使用
let sd = require("silly-datetime");
<td> time | dateFormat </td>
dateFormat(value)=>{return sd.format(time,"YYYY-MM-DD HH:mm:ss")}
path
模塊是 node
提供的,用於處理文件路徑和目錄路徑的實用工具
安裝
npm i path
經常使用的幾個方法:
path.extname(name)
path.join()
path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// 返回: '/foo/bar/baz/asdf'path.parse(path)
法返回一個對象,其屬性表示 path 的重要元素
返回的對象將具備如下屬性:
dir <string>
root <string>
base <string>
name <string>
ext <string>
示例:
path.parse('/home/user/dir/file.txt');
// 返回:
// { root: '/',
// dir: '/home/user/dir',
// base: 'file.txt',
// ext: '.txt',
// name: 'file' }
複製代碼
session
是一種記錄客戶狀態的機制,一般是保存在服務端
,經常用來做爲用戶鑑權的機制。
安裝
npm i koa-session --save
配置
使用
設置值: ctx.session.username = "張三"; 獲取值: ctx.session.username
源碼
let app = require("koa")();//實例化一個koa
let session = require("koa-session"); //session的操做
//配置session中間件
app.keys = ["some secret hurr"];
let CONFIG = {
key: 'koa:sess', //cookie key (default is koa:sess)
maxAge: 86400000, // cookie的有效期,默認一天
overwrite: true, //是否能夠overwrite (默認default true)
httpOnly: true, //cookie是否只有服務器端能夠訪問,默認true
signed: true, //簽名默認true
rolling: false, //在每次請求時強行設置cookie,這將重置cookie過時時間(默認:false)
renew: false, //(boolean) renew session when session is nearly expired,
};
//使用session中間插件
app.use(session(CONFIG,app));
app.listen(3000);
複製代碼
安裝
npm i koa2-ueditor
引入使用
const ueditor = require("koa2-ueditor")
配置富文本編輯器 主要是配置圖片的保存位置與保存格式
router.all('/editor/controller', ueditor(['public', {
"imageAllowFiles": [".png", ".jpg", ".jpeg"],
"imagePathFormat": "/upload/ueditor/image/{yyyy}{mm}{dd}/{filename}" // 保存爲原文件名
}]))
複製代碼
引入ueditor靜態文件資源
將官網中的public資源 所有複製到本身的項目中
而後在使用富文本編輯器的地方引入項目的文件
<script type="text/javascript" charset="utf-8" src="/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="/ueditor/ueditor.all.min.js"> </script>
<script type="text/javascript" charset="utf-8" src="/ueditor/lang/zh-cn/zh-cn.js"></script>
複製代碼
配置富文本編輯器的ueditor.config.js
文件
路徑即爲項目中配置富文本編輯器對的位置
富文本編輯器爲咱們提供了很複雜的一套導航欄,咱們能夠根據須要,自行配置
//自定義工具類功能按鈕與下拉按鈕
,toolbars: [["fullscreen","source","undo","redo","insertunorderedlist","insertorderedlist","link","unlink","help","attachment","simpleupload","insertimage","emotion","pagebreak","date","bold","italic","fontborder","strikethrough","underline","forecolor","justifyleft","justifycenter","justifyright","justifyjustify","paragraph","rowspacingbottom","rowspacingtop","lineheight","insertcode"]]
複製代碼
使用富文本編輯器
把以前的textarea
使用script標籤代替 <script id="editor" type="text/plain" style="width:600px;height:300px;"></script>
<script> //實例化editor富文本編輯器 var ue = UE.getEditor('editor'); //設置富文本編輯器裏面的內容 //當須要往裏面填充內容的時候使用 ue.addListener("ready",function(){ ue.setContent(`我是一隻小小鳥`) }) </script>
複製代碼
安裝
npm i koa-multer
配置
使用方式
源碼
let multer = require("koa-multer"); //文件上傳
//配置文件上
let storage = multer.diskStorage({
//文件保存路徑
destination: function(req,file,cb){
cb(null,'public/uploads');
},
//修改文件名稱
filename:function(req,file,cb){
//以點進行分割成數組,數組的最後一項就是後綴名
let fileFormat = (file.originalname).split(".");
//對文件重新進行命名 時間加文件後綴
cb(null, Date.now() + "." + fileFormat[fileFormat.length - 1]);
}
});
//加載文件上傳配置
let upload = multer({storage:storage});
複製代碼
當上傳圖片的時候,實現圖片的預覽功能
源碼
<form action="/doAdd" method="post" enctype="multipart/form-data" >
<input type="file" onchange="uploadImg(this)" name="img_url" />
<img src="" id="viewImg">
</form>
<!-- 實時顯示上傳的圖片 -->
<script> function uploadImg(fileDom) { // 獲取圖片數據對象 let file = fileDom.files[0]; let reader = new FileReader(); reader.readAsDataURL(file); //確保文件成功獲取,base64數據量比較大 reader.onload = function (event) { let e = event || window.event; //獲取到img標籤 let img = document.getElementById("viewImg"); //設置img標籤的路徑 img.src = e.target.result; } } </script>
複製代碼
引入文件
引入jqpaginator.js文件
前端的使用
使用art模板渲染時傳值
操做monage數據庫操做
Express 基於 Node.js 平臺,快速、開放、極簡的 web 開發框架
全局安裝生成器
npm install -g express-generator
建立應用
express 項目名 express myDemo
參考文檔
安裝
npm i mongoose
配置
useUnifiedTopology: true 解決以下錯誤
useNewUrlParser:true 解決以下警告
示例
安裝
npm i body-parser
使用
const bodyParser = require('body-parser');
(1)處理json數據
bodyParser.json(options)
app.use(bodyParser.json());
(2)處理Buffer數據流,解析二進制格式
bodyParser.raw(options)
(3)處理文本數據,解析文本格式
bodyParser.text(options)
(4)處理UTF-8的編碼的數據,解析文本格
bodyParser.urlencoded(options)
app.use(bodyParser.urlencoded({extented:false}))
示例
安裝
npm i express-session
配置
session()的參數options配置項主要有:
name
: 設置cookie中,保存session的字段名稱,默認爲connect.sidstore
: session的存儲方式,默認爲存放在內存中,咱們能夠自定義redis等genid
: 生成一個新的session_id時,默認爲使用uid2這個npm包rolling
: 每一個請求都從新設置一個cookie,默認爲falseresave
: 即便session沒有被修改,也保存session值,默認爲truesaveUninitialized
:強制未初始化的session保存到數據庫secret
: 經過設置的secret字符串,來計算hash值並放在cookie中,使產生的signedCookie防篡改cookie
: 設置存放sessionid的cookie的相關選項// 提交靜態資源 app.use(express.static('public'))
源碼
let express = require('express');
let app = express();
// 在後端配置,讓全部的人均可以訪問個人api接口
app.use('*', function (req, res, next) {
// 容許哪些客戶端來訪問我
res.setHeader("Access-Control-Allow-Origin","*");
// 容許能夠添加哪些頭,而後來訪問我
res.setHeader("Access-Control-Allow-Headers","*");
// res.header('Access-Control-Allow-Headers', 'Content-Type,Authorization');
// 容許哪些方法來訪問我
res.setHeader("Access-Control-Allow-Methods","OPTIONS,PUT,DELETE");
// res.header('Access-Control-Allow-Methods', '*');
// 能夠每隔半小時,來發送一個options請求--試探請求
res.setHeader("Access-Control-Max-Age","1800");
// 請求的類型編碼
res.header('Content-Type', 'application/json;charset=utf-8');
// 容許客戶端攜帶憑證,處理cookie信息,若是有,而且不對每次請求都新開一個session
res.setHeader("Access-Control-Allow-Credentials",true);
next();
});
複製代碼
安裝
npm i jsonwebtoken
引入
const jwt = require('jsonwebtoken');//引入生成token的包
使用
示例
源碼
jwt.sign(arr, keys.secretOrkey, { expiresIn: 3600 }, (err, token) => {
if (err) throw err;
res.json({
code: 1,
token: "Bearer " + token //生成格式 Bearer + token
})
});
複製代碼
安裝
npm i bcrypt
引入
const bcrypt = require('bcrypt')//引入加密的包
密碼加密
密碼解密
完整示例
源碼
const Mpage = require("../../model/Mpage.js");
const express = require("express");
const router = express.Router();
const jwt = require('jsonwebtoken');//引入生成token的包
const bcrypt = require('bcrypt')//引入加密的包
const keys = require("../../config/keys")//引入密鑰
//註冊接口
router.post("/register", (req, res) => {
Mpage.findOne({ email: req.body.email }).then(user => {
if (user) {
return res.status(400).json("郵箱已經被註冊")
} else {
const newUser = new Mpage({
name: req.body.name,
email: req.body.email,
password: req.body.password
});
//生成salt的迭代次數
const saltRounds = 10;
//生成salt並獲取hash值
bcrypt.genSalt(saltRounds, function (err, salt) {
bcrypt.hash(newUser.password, salt, function (err, hash) {
if (err) console.log(err);
newUser.password = hash;
newUser.save().then(user => res.json(
res.json({code: 1,msg: '註冊成功'})
)).catch(err => res.json(err))
})
})
}
})
})
//登陸接口
router.post("/login", (req, res) => {
const email = req.body.email;
const password = req.body.password;
Mpage.findOne({ email }).then(user => {
if (!user) { return res.status(404).json("用戶名不存在") }
//密碼解密比對
bcrypt.compare(password, user.password).then(isMatch => {
if (isMatch) {
const userArr = {
id: user.id,
name: user.name,
email: user.email
};
//生成token
jwt.sign(userArr, keys.secretOrkey, { expiresIn: 3600 }, (err, token) => {
if (err) throw err;
res.json({
code: 1,
token: "Bearer " + token
})
})
} else {
return res.status(400).json("密碼錯誤")
}
})
})
})
複製代碼
安裝
npm i passport
引用
const passport = require('passport');
配置
- app.use(passport.initialize()); // 初始化passport
- require("./config/passport")(passport); //導入配置文件
passport配置文件
權限校驗
源碼
// 配置passprot
app.use(passport.initialize()); // 初始化passport
require("./config/passport")(passport); //導入配置文件
複製代碼
// 專門用來配置Passport 驗證jwt 配置的話,搜索passport-jwt
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const keys = require('../config/keys');
const mongoose = require('mongoose');
const User = mongoose.model('User'); //把User的model導入
let opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = keys.secretOrkey; //祕鑰,必須與生成token時的祕鑰一直
//參數爲在主函數中傳遞過來的
module.exports = passport => {
//進行token權限的校驗,將token中的信息解析,放在jwt_payload中
passport.use(new JwtStrategy(opts, function (jwt_payload, done) {
//從數據庫裏找該用戶的信息,並返回
User.findById(jwt_payload.id).then(user => {
if (user) {
return done(null, user) //返回用戶信息
}
return done(null, false)
}).catch(err => console.log(err))
}));
}
複製代碼
router.get("/find/:id", passport.authenticate("jwt", { session: false }), (req, res) => {
//獲取生成token的用戶信息
let tokenData = req.user;
User.findOne({ _id: req.params.id }).then(information => {
if (!information) {
return res.status(404).json('沒有查到該用戶信息')
}
res.json(information)
})
})
複製代碼
源碼
// 獲取全部的新聞數據,
// 分頁,排序,模糊查詢,
router.get("/list",passport.authenticate("jwt", { session: false }),(req,res)=>{
//獲取要查詢的內容
let attr = req.query.title;
//獲取當前頁,默認第一頁
let currentPage = parseInt(req.query.currentPage ) || 1;
//獲取每頁的大小,默認每頁五條數據
let pageSize = parseInt(req.query.pageSize)|| 5;
//分頁時,每次截取的數量,1-5 6-10
let slipNum=(currentPage-1)*pageSize;
//排序的字段,按照那個字段進行排序
let sort_attr = req.query.sort_attr || "";
//排序的規則,正序,倒序,默認正序
let sort_value = req.query.sort_value || -1;
//判斷查詢的數據是否存在
let attrs = {};
if(attr){
//根據查詢數據,設置模糊查詢
attrs.title = new RegExp(attr)
}
//判斷排序規則是否存在,
let sort = {};
if(sort_attr){
sort = {[sort_attr]:sort_value};
}
//根據上述條件獲取到信息列表
news.find(attrs).skip(slipNum).limit(pageSize).sort(sort).then(newss=>{
if(!newss){
return res.status(404).json("沒有任何內容")
}
//根據條件獲取信息列表的總條數
news.count(attrs).then((data) => {
res.json({ //返回信息列表與當前的總頁數
count:data,
news:newss
})
})
})
})
複製代碼
安裝
npm i mongoose
步驟:
const mongoose = require("mongoose")
mongoose.connect("mongodb://127.0.0.1/myapp")
若是在數據庫沒有myapp這個數據庫,鏈接時,並不會自動建立這個數據庫 ,使用 useNewUrlParser
來解決mongoose中的警告問題 mongoose.connect('mongodb://127.0.0.1:27017/djdb', { useNewUrlParser: true }).then()
安裝babel
npm i @babel/cli npm i @babel/core npm i @babel/preset-env
配置輸出位置 packjson文件
配置 .babelrc文件
注意
@babel/cli 解析core
@babel/core 核心碼
@babel/preset-env 將es6--->es5
複製代碼