express 保留了node.js原生的功能,添加了一些方法,增强原有的功能
use 监听 1 2 3 4 5 6 const express = require('express'); var server = express(); server.use('/', function (req, res) { res.send({a: 1, b: 2}) }) server.listen(8080);
处理请求 1 server.use('adress', callback(req, res) {})
接受请求的方法
get(‘/‘, callback(req, res)) // 处理get
1 2 3 server.get('/', (req, res) => { req.query // get参数 })
post(‘/‘, callback(req, res)) // 处理post
1 2 3 4 5 6 7 8 需要body-parser 中间件 server.use(bodyParser.urlencoded({ extended: false, // 扩展模式 limit: 2*1024*1024 // 限制 })) server.post('/', (req, res) => { req.body // post参数 })
use(‘/‘, callback(req, res)) // 都能处理
读取文件 读取静态文件
1 2 const expressStatic = require('express-static'); server.use(expressStatic('./www'))
链式操作 1 2 3 4 5 6 7 // 处理同一个接口地址 server.use('/', (req, res, next) { next(); // 继续下一步 }) server.use('/', (req, res, next) { })
中间件 1 2 3 4 5 6 7 8 9 10 11 12 // lib/body.js module.exports = function (req, res, next) { req.body = {} // 自定义 req属性可以传递 next() // 执行下一步 } const body = require('./libs/body'); server.use(body) server.use('/', (req, res) { console.log(req.body) // {} 通过 body 传递过来 })
cookie 客户端保存数据 空间非常小 安全性非常差 校验cookie是否被篡改
发送 1 2 3 4 5 6 7 res.secret = String // 签名秘钥 res.cookie('key', value, { path: '' // 向上继承 maxAge: // 毫秒 signed: Boolean })
读取 1 2 3 4 5 6 7 const cookieParser = require('cookie-parser'); server.use(cookieParser(secret)) server.use((req, res) => { req.cookies // 未签名 req.signedCookies // 签名 })
删除
session 保存数据在服务端 不能独立存在,基于cookie
1 2 3 4 5 6 7 8 9 10 11 12 13 const cookieSession = require('cookie-session'); server.use(cookieParser()); server.use(cookieSession({ name: '' keys: [] // session keys maxAge: })) server.use('/', (req, res) => { req.session }) delete req.session
jade html模板引擎 改名为(pug)
1 2 const jade = require('jade'); var str = jade.renderFile('filename', {pretty: true});
语法 根据缩进划分层级
属性后面括号里面,多个逗号分隔
内容空格写
style JSON写法和普通写法
class arr写法和普通写法
简写 div.wrap - div#box -> div class=”wrap” div id=”box”
复合属性json写法 tag&attributes
自动识别单双标签
| 表示原样输出
tag + ‘.’ 表示所有子代原样输出
-var 写js 循环,判断1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 html head style script(src="a.js") script include 'filename' link(href="a.css", rel="relstylesheet") body div(style="width:100px;height: 200px") div(style={width: '100px', height: '200px'}) div(class="left right active") div(class=['left', 'right', 'active']) ul(id='list') li 内容 li&attributes({id: 'box', title: 'sss'}) -var a = 0;
ejs 1 2 const ejs = require('ejs'); ejs.renderFile(', {变量}', (err, data) => {})
语法
body-parser 解析post数据
multer 解析文件数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 var obj = multer({dest: '上传路径'}) server.use(obj.any()) server.use((req, res) => { req.files // arr originalname path // rename var newName = req.files[0].path + pathLib.parse(req.files[0].originalname).ext; fs.rename(req.files[0].path, newName, (err, data) => { if (err) { res.send('上传失败') } else { res.send('ok') } }) })
consolidate 适配模板引擎
1 2 3 4 5 6 7 8 require('consolidate'); //引入 server.set('view engine', 'html') // 输出文件类型 server.set('views', '模板文件目录') // 模板文件位置 server.engine('html', consolidate.ejs) // 模板类型 server.get('/', (req, res) => { res.render('index.ejs', {name: '1111'}); })
router (子服务) 路由 => 拆分成模块
1 2 3 4 5 6 // create router = express.Router(); // add server.use('/user', router); // action router.get() post() use()
数据库 MySQL 免费 性能不错 中小型网站 Server端: 存数据 Client端: 客户端
数据库基本概念 两种单位
库: 文件夹 - 管理
表: 文件 - 存数据
表 -> 行: 一条数据
表 -> 字段(域): 一个数据项
主键: 唯一标识符 性能高
node使用mysql
连接
1 2 const mysql = require('mysql'); mysql.createConnection(host, port, user, password,database);
查询
1 db.query(SQL, (err, data) => {})
SQL (结构化查询语句) 关键字大写, 库 表 字段 加上`` 4大查询语句: 增删改查 增: INSERT1 2 INSERT INTO 表名 (字段列表) VALUES(值列表) INSERT INTO `user_table` (`ID`, `username`, `password`) VALUES(0, 'xiaohong', '123');
删: DELETE
改: UPDATE1 UPDATE 表 SET 字段-值, 字段-值... WHERE 条件
查: SELECT
1 2 SELECT what FROM 表 SELECT * FROM `user_table` WHERE 条件;
子句: WHERE 条件 1 2 3 WHERE name = '' WHERE age > 18 AND score < 90 WHERE cash > 100 OR score > 10000
ORDER 排序
1 2 3 4 5 6 ORDER BY age ASC/DESC ASC - 升序 (从小到大) DESC - 降序 (从大到小) ORDER BY price ASC ORDER BY price ASC, sales DESC
GROUP 聚类 - 合并相同
LIMIT - 限制输出 - 分页
1 2 3 4 5 6 7 LIMIT 10; 前10条; LIMIT 5,8; 从5开始,取8条 // 分页 每页20条 第一页: 0, 20 0~19 第二页: 20, 20 20~39 第三页: 40, 20
子句之间有顺序关系 WHERE GROUP ORDER LIMIT 筛选 合并 排序 限制
MD5 1 2 3 4 5 crypto node系统模块 var crypto = require('crypto'); var obj = crypto.createHash('md5'); obj.update('123456'); obj.digest('hex');
END 附上一份我自己搭建的express服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 // server.js const express = require('express'); // 解析数据 // 1. 接口数据 const bodyParser = require('body-parser'); // 2. 文件数据 const multer = require('multer'); // cookie设置 const cookieParser = require('cookie-parser'); const cookieSession = require('cookie-session'); // 静态文件设置 const staticLib = require('express-static'); // mysql const mysql = require('mysql'); // 模板引擎 const consolidate = require('consolidate'); // create listen var server = express(); server.listen(8080); // use the middle parser server.use(bodyParser.urlencoded({extended: false})); server.use(multer({dest: 'filepath'}).any()); server.use(cookieParser('secret')); (function () { var arr = []; for(var i =0;i<100000; i++) { arr.push('keys_' + Math.random()); } server.use(cookieSession({ name: 'session_id', keys: arr, maxAge: 2*60*60*1000 // 过期时间 })) })() server.set('view engine', 'html'); server.set('views', 'temlate path'); server.engine('html', consolidate.ejs); // use the child router server.use('/admin', require('./route/admin/index')); server.use('/', require('./route/web/index')); // use the static file server.use(staticLib('./www/'));