跨域
由于浏览器的同源限制,其执行JS脚本时,会检查这个脚本属于哪个页面,如果不是同源页面,就不会被执行。
http://www.123.com/index.html
调用 http://www.123.com/server.php
(非跨域),
http://www.123.com/index.html
调用 http://www.456.com/server.php
(主域名不同:123/456,跨域),
http://abc.123.com/index.html
调用 http://def.123.com/server.php
(子域名不同:abc/def,跨域),
http://www.123.com:8080/index.html
调用 http://www.123.com:8081/server.php
(端口不同:8080/8081,跨域),
http://www.123.com/index.html
调用 https://www.123.com/server.php
(协议不同:http/https,跨域),
localhost和127.0.0.1虽然都指向本机,但也属于跨域。
如何解决跨域
1 JSONP/代理
2 修改header
3 koa中,使用cors模块
const Koa = require('koa');
const cors = require('@koa/cors');
const app = new Koa();
app.use(cors())
Koa2详解
application
koa
的入口构造函数,通过new Koa()
生成一个koa
实例app
,通过app.use
将中间件函数传入数组中,通过app.listen
启动http服务器的同时完成以下动作:
- 处理存放中间件函数的数组
- 使用node原生对象
req
和res
创建执行上下文,生成处理后的context
对象 - 依次将数组中的中间件函数应用于2中生成的
context
执行环境中 - 对请求做出响应
ctx
将node中原生的req
和res
对象的方法和属性,挂载到context
上
req
通过get
set
方法可以拿到网络请求的相关属性
res
非常常用且与直接面向客户端的核心模块,也通过get
set
方法获得。
middlewares
koa中的中间件均为async函数,执行顺序为洋葱模型,通过await next()
传递中间件的控制权。
koa-compose
控制中间件的执行顺序。
node进程与事件循环
由于node天生单线程的缘故,在使用node开发服务器的时候,鲁棒性成了其不得不进行的考量,因此,当node有繁重计算任务的时候,使用node子进程替代主进程,主进程监听子进程,可有效提高运行服务的稳定性。
const cp = require('child_process')
const childProcess = cp.fork(script, [])//通过fork方法派生出子进程
let invoked = false
childProcess.on('error', err => {})
childProcess.on('exit', code => {})
childProcess.on('message', data => {
//核心方法
})
对于node异步非阻塞的理解
当A调用B的时候,当A"原地"等待B的调用结果时,则整个系统为同步阻塞的;当A不需要等待B的结果时,则为异步的,实现异步的方式有A的主动轮询或者B的回调通知,异步大部分情况下不会导致阻塞,一句话总结:同步异步是过程,在于有无消息通知的机制;阻塞非阻塞是状态,在于调用方是干等结果还是各不耽误。
一个事件循环中的异步函数优先级
node中的libuv
封装了各个OS的IO操作,对外提供了一致的访问接口,当我们在讨论node事件循环时,其实我们在讨论的是libuv
。
- prosess.nextTick,不属于事件循环的任一阶段,优先执行
- Promise.resolve,同上,优先级仅次于prosess.nextTick
- 定时器,当没有prosess.nextTick和 Promise.resolve时,事件循环会进入定时器Timers阶段
- 执行OS的IO回调
- 执行poll中的callback
- 执行check阶段的
setImmediate
函数
node新特性
- 通过
util
模块提供的接口改写callback函数为Promise
const util = require('util')
util.promisify(fs.readFile)('./path')
.then(() => {})
Mongoose采坑
.save()失效
在更新数据时使用.save()
方法竟然莫名失效了!这个问题找了N久,最终在Schema
中发现了问题之所在:Schema
中的一个字段被我设置成了Schema.Types.Mixed
,就是这个Mixed
导致.save()
失效,改成[ ]
后,搞定!
exec()
类似model.find()
为一次数据库查询,即query
,query
立刻执行,exec()
方法使query
变为标准的promise
,即await model.find().exec()
;同时,.then()
方法也可将一个query
转为promise
,进行链式操作。
安装node-sass
出错的解决办法
使用cnpm
源即可
SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ npm install node-sass
网友评论