美文网首页
Node填坑

Node填坑

作者: Devildi已被占用 | 来源:发表于2018-01-23 18:16 被阅读0次

    跨域

    由于浏览器的同源限制,其执行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填坑

          本文链接:https://www.haomeiwen.com/subject/zrmsaxtx.html