Node填坑

2018-01-23  本文已影响0人  Devildi已被占用

跨域

由于浏览器的同源限制,其执行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服务器的同时完成以下动作:

  1. 处理存放中间件函数的数组
  2. 使用node原生对象reqres创建执行上下文,生成处理后的context对象
  3. 依次将数组中的中间件函数应用于2中生成的context执行环境中
  4. 对请求做出响应

ctx

将node中原生的reqres对象的方法和属性,挂载到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

node事件循环(来自node官网)
  1. prosess.nextTick,不属于事件循环的任一阶段,优先执行
  2. Promise.resolve,同上,优先级仅次于prosess.nextTick
  3. 定时器,当没有prosess.nextTick和 Promise.resolve时,事件循环会进入定时器Timers阶段
  4. 执行OS的IO回调
  5. 执行poll中的callback
  6. 执行check阶段的setImmediate函数

node新特性

  1. 通过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()为一次数据库查询,即queryquery立刻执行,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
上一篇下一篇

猜你喜欢

热点阅读