Node填坑

跨域

由于浏览器的同源限制,其执行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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • # 模块机制 node采用模块化结构,按照CommonJS规范定义和使用模块,模块与文件是一一对应关系,即加载一个...
    RichRand阅读 2,578评论 0 3
  • 1.简书 koa是由Express原班人马打造,致力于成为一个更小、更富有表现力、更健壮的Web框架。使用koa编...
    不去解释阅读 2,727评论 0 11
  • 参考资料 https://chenshenhai.github.io/koa2-note/note/static/...
    JunChow520阅读 10,592评论 1 8
  • 面试题一:https://github.com/jimuyouyou/node-interview-questio...
    R_X阅读 1,689评论 0 5
  • 陆陆续续用了koa和co也算差不多用了大半年了,大部分的场景都是在服务端使用koa来作为restful服务器用,使...
    Sunil阅读 1,627评论 0 3