前端进阶-node1

6.1 node中的模块化导入导出和ES6的区别

参考答案:

node commonjs规范模块化

  1. module对象为模块运行时生成的标识对象,提供模块信息;

  2. exports为模块导出引用数据类型时,modulex.exports与exports指向的是同一对象,require导入的是module.exports导出的对象;

  3. 同一模块导入后存在模块缓存,后续多次导入从缓存中加载;

  4. 源模块的引用与导入该模块的引用是同一对象;

  5. 最好不要同时使用module.exports与exports,导出对象使用module.exports,导出变量使用exports。

es6规范模块化

  1. es6通过export和import实现导出导入功能;

  2. es6 export支持导出多个变量,export default是export形式的语法糖,表示导出default接口;

  3. import * as xx from 'xx.js'导入的是Module对象,包含default接口和其他变量接口;

  4. 多个模块导入多次,只会执行一次;

  5. 导出引用数据类型时,导出对象与导入对象指向同一个变量,修改导出变量对象,源对象也会发生改变。

  6. 导出单个变量建议使用export default,导出多个变量使用export。

6.2 Node 中间件

参考答案

中间件概念

在NodeJS中,中间件主要是指封装所有Http请求细节处理的方法。一次Http请求通常包含很多工作,如记录日志、ip过滤、查询字符串、请求体解析、Cookie处理、权限验证、参数验证、异常处理等,但对于Web应用而言,并不希望接触到这么多细节性的处理,因此引入中间件来简化和隔离这些基础设施与业务逻辑之间的细节,让开发者能够关注在业务的开发上,以达到提升开发效率的目的。

中间件的行为比较类似Java中过滤器的工作原理,就是在进入具体的业务处理之前,先让过滤器处理。它的工作模型下图所示。

中间件工作模型

中间件机制核心实现

中间件是从Http请求发起到响应结束过程中的处理方法,通常需要对请求和响应进行处理,因此一个基本的中间件的形式如下:

const middleware = (req, res, next) => {
  // TODO
  next()
}

以下通过两种方式的中间件机制的实现来理解中间件是如何工作的。

方式一

如下定义三个简单的中间件:

const middleware1 = (req, res, next) => {
  console.log('middleware1 start')
  next()
}

const middleware2 = (req, res, next) => {
  console.log('middleware2 start')
  next()
}

const middleware3 = (req, res, next) => {
  console.log('middleware3 start')
  next()
}

通过递归的形式,将后续中间件的执行方法传递给当前中间件,在当前中间件执行结束,通过调用next()方法执行后续中间件的调用。

// 中间件数组
const middlewares = [middleware1, middleware2, middleware3]
function run (req, res) {
  const next = () => {
    // 获取中间件数组中第一个中间件
    const middleware = middlewares.shift()
    if (middleware) {
      middleware(req, res, next)
    }
  }
  next()
}
run() // 模拟一次请求发起

执行以上代码,可以看到如下结果:

middleware1 start
middleware2 start
middleware3 start

如果中间件中有异步操作,需要在异步操作的流程结束后再调用方法,否则中间件不能按

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

前端岗位面试真题宝典 文章被收录于专栏

本面试宝典均来自校招面试题目大数据进行的整理

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务