node.js
node.js可以解析js代码,没有浏览器的安全级别限制。不可以使用dom、bom。
npm的使用
1 2 3 4 5 6 7 8 9 10 11
| npm init npm install 包名 -g npm install 包名 --save-dev npm uninstall 包名 npm update 包名 npm info 包名
#pakage文件中 "dependencies":{ "md":"^2.1.1"}} "dependencies":{ "md":"~2.1.1"}} "dependencies":{ "md":"*"}}
|
开启ES模块化写法
1 2 3 4 5 6 7 8
| #pakage.json文件中 { "type":"module" }
#引用使用es6方式 import module from '.js' export module = { }
|
内置模块
npm i -g nodemon 自动重启服务器
01 http模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| let http = require('http')
http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' }) res.write(renderHTML(req.url)) res.end() }).listen(3000, () => { console.log('server start'); })
let server = http.createServer() server.on("request",(req,res)=>{ })
server.listen(3000,()=>{ })
|
JSONP:动态创建script标签,src的指向没有跨域限制
cros请求头实现跨域
1 2 3
| res.writeHead(200,{ "access-control-allow-origin":"*" })
|
可以作为中间件(中间层),从接口get、pots数据,在传给前端,绕开跨域问题
02 url模块
1 2 3 4 5 6 7
| let url = require('url')
url.parse( req.url,true)
pathname query
|
03 querystring模块
1 2 3 4 5 6 7 8 9 10 11 12 13
| let querystring = require("querystring")
let str = 'name=zmxj&age=21&location=nanchang' let obj = querystring.parse(str)
let mystr = { name:'zmxj',age:'21',location:'nanchang'} let myobj = querystring.stringify( mystr )
querystring.escape() querystring.unescape()
|
04 events模块
1 2 3 4 5 6 7
| const Event = require('events') const event = new Event()
event.on('play', () => { console.log('我被触发了'); }) event.emit('play')
|
05 fs文件操作
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 44 45 46 47 48
| const fs = require('fs')
fs.mkdir('./路径/目录名字',(err)=>{ if(err && err.code === EEXIST){ console.log('目录已经存在') } })
fs.rename('./路径/目录名字','./路径/新目录',(err)=>{ if(err && err.code === ENOENT ){ console.log('目录不存在') } })
fs.rmdir('./路径/目录名字',(err)=>{ if(err && err.code === ENOENT ){ console.log('目录不存在') } })
fs.writeFile('./路径/目录名字/文件名字.文件格式','内容',err=>{ })
fs.writeFile('./路径/目录名字/文件名字.文件格式','\n新内容',err=>{})
fs.readFile('./路径/目录名字/文件名字.文件格式','utf-8',(err,data)=>{ if(!err){ } })
fs.unlink('./路径/目录名字/文件名字.文件格式',err=>{})
fs.readdir('./路径/目录名字',(err,data)=>{ if(!err){ console.log(data) } })
|
Cookie
存储在用户浏览器的一段不超过4kb的字符创。由name和value以及用于控制cookie有效期、安全期、适用范围的可选属性组成。
特性
- 自动发送
- 域名独立
- 过期时限
- 4kb限制
客户端第一次请求服务器时,服务器通过响应头的形式,向客户顿发送一个生份认证的cookie,客户端会自动将cookie保存在浏览器中。
随后,客户端每次请求服务器时,浏览器都会自动将cookie通过请求头的形式发送给服务器,服务器即可验证客户端身份。
cookie不具有安全性,浏览器提供了读写cookie的api,因此cookie很容易被伪装,避免存储cookie存储重要隐私数据。
express
中间件
不用修改原有代码,添加和扩展一些功能
中间件函数中可以
- 执行任何代码
- 修改request或response响应对象
- 结束请求响应周期
- 调用下一个中间件
1 2 3 4 5 6 7 8
|
app.use((req,res,next)=>{ next() })
|
使用 express 托管静态文件
1 2 3 4 5 6 7 8
| app.use(express.static('public'))
http: http: http: http: http:
|
应用级别中间件
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
| let express = require('express') const app = express()
app.use((req,res,next)=>{ next() })
app.use('/home/:id',(req,res,next)=>{ next() })
app.get('/home/:id',(req,res,next)=>{ next() })
app.get('/home/:id', function(req,res,next){ next() },function(req,res,next){ next() })
next('route')
function loa1(req,res,next){ .... next() } function loa2(req,res,next){ .... next() } let arr = [ loa1,loa2 ] app.get('home/:id',arr,function(req,res,next){ ...})
|
路由器级别中间件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
const express = require('express')
const router = express.Router()
router.get('/dfg',(req,res)=>{})
module.exports = router
const router = require('./router')
app.use(router)
app.use('/abc',router)
|
错误处理中间件
将任何内容 传给 next() (除了字符串router) express都会将当前请求视为错误,跳过其余 中间件,进入错误处理中间件
1 2 3 4 5 6 7 8 9 10 11
|
app.use((err,req,res,next)=>{ })
app.use((req,res,next)=>{ res.status(404).send('404 not found.') })
|
内置中间件
- json( )
- urlencoded( )
- raw( )
- text( )
- static( )
第三方中间件
搭配mysql
安装依赖
在mysql中创建数据库、建表、添加数据
在node中引入并连接mysql
1 2 3 4 5 6 7 8 9
| let mysql = require('mysql')
let sqlConnection = mysql.createConnection({ host: 'localhost', user: 'root', password: '123456', database: 'huawei_vmall' }) sqlConnection.connect()
|
使用mysql
1 2 3 4 5 6 7 8 9 10 11 12
| app.get('/mysql-goodslist', function (req, res) { let sql = "SELECT * FROM goodslist" sqlConnection.query(sql, function (err, result) { if (err) { return; } res.send(JSON.stringify(result)) }) sqlConnection.end() })
|
node 登录 token
安装 jsonwebtoken 用于生成和解密token
1 2 3 4
| let jwt = require('jsonwebtoken')
const token = jwt.sign(result[0].user_name, 'yuyu')
|