[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
复制代码