前端面试---Node.js

3 阅读11分钟

基础模块

全局对象

Nodejs 中的全局对象是 global。 下面给出一些常见的全局对象:

  • Class:Buffer
  • process
  • console
  • clearInterval、setInterval
  • clearTimeout、setTimeout
  • global

模块系统

路由

内置模块

模块名称描述常用类/方法典型用途
fs (File System)文件系统操作readFilewriteFilemkdirreaddircreateReadStreamcreateWriteStream文件读写、目录操作
path处理文件路径joinresolvedirnamebasenameextname跨平台路径处理
httpHTTP 服务器/客户端createServerrequestget创建Web服务器/客户端
httpsHTTPS 服务器/客户端createServerrequest创建安全Web服务
urlURL解析与处理parseformatURLURL解析和构造
querystring查询字符串处理parsestringify处理URL查询参数
os操作系统信息cpusfreememtotalmemhomedirhostname获取系统信息
events事件处理EventEmitteronemitonce自定义事件系统
stream流操作ReadableWritableDuplexTransformpipe处理数据流
crypto加密功能createHashcreateCiphercreateDecipherrandomBytes加密/解密/哈希
zlib压缩/解压createGzipcreateGunzipcreateDeflatecreateInflate数据压缩解压
util实用工具promisifyinheritsformattypes工具函数
child_process子进程管理execexecFilespawnfork创建子进程
cluster集群管理forkisMasterisWorker多进程负载均衡
dns域名解析lookupresolvereverse域名解析
domain处理多个异步操作错误的模块create runadd提供了一种将多个不同的 I/O 操作分组并统一处理其错误的机制。
net网络操作createServerconnectSocketTCP服务器/客户端
dgramUDP数据报createSocketsendbindUDP通信
readline逐行读取createInterfaceon('line')命令行交互
repl交互式解释器startcontext创建REPL环境
vm虚拟机runInContextcreateContextScript执行JavaScript代码
assert断言测试equalstrictEqualdeepEqualthrows单元测试断言
buffer二进制数据处理Bufferallocfromconcat处理二进制数据
console控制台输出logerrortimetimeEnd调试输出
timers定时器setTimeoutsetIntervalsetImmediateclearTimeout定时任务
perf_hooks性能监控performancePerformanceObserver性能测量
worker_threads工作线程WorkerisMainThreadparentPort多线程编程

常用框架

Express

Koa

手写简易版koa

// mykoa.js

const http = require('http');

class MyKoa {
  constructor() {
    // 中间件数组
    this.middlewares = [];
  }

  use(middleware) {
    this.middlewares.push(middleware);
  }

  listen(port) {
    // 创建server
    const server = http.createServer((req, res) =>
      this.handleRequest(req, res)
    );
    // 监听端口
    server.listen(port);
  }

  handleRequest(req, res) {
    const ctx = this.createContext(req, res);
    return this.compose(this.middlewares, ctx)
      .then(() => {
        if (!ctx.body) {
          res.statusCode = 404;
          res.end('Not Found');
        } else {
          res.end(ctx.body);
        }
      })
      .catch((err) => {
        res.statusCode = 503;
        res.end('Server Error');
        console.error(err);
      });
  }

  createContext(req, res) {
    const context = {
      req,
      res,
      state: {},
    };

    context.request = context.req;
    context.response = context.res;

    return context;
  }

  // 中间件最核心的代码
  compose(middlewares, context) {
    // 返回promise处理异步函数
    const dispatch = (i) => {
      if (i >= middlewares.length) return Promise.resolve();
      const middleware = middlewares[i];
      // 对应middleware的函数(ctx, next) => {}
      // 其中next使用递归dispatch(i + 1)处理
      return Promise.resolve(middleware(context, () => dispatch(i + 1)));
    };

    return dispatch(0);
  }
}

module.exports = MyKoa;

// server.js
const MyKoa = require('./mykoa')
const app = new MyKoa();

app.use(async (ctx, next) => {
  console.log(`${ctx.req.method} ${ctx.req.url}`);
  console.log(`1`);
  await next();
  console.log(`2`);
});

app.use(async (ctx, next) => {
  console.log(`3`);
  ctx.body = 'Hello, MyKoa!';
});

app.listen(3000);

终端中执行如下命令:

node server.js
// 控制台输出  GET / 1 3 2

打开浏览器,访问http://localhost:3000,你应该会看到Hello, MyKoa!的输出。

这个简易版Koa实现了Koa的基本功能,包括中间件系统和请求处理。如果需要更高级的功能,如路由、错误处理等,可以在此基础上进一步扩展。

Nest

面试题

  • 解释下中间件和洋葱模型?

  • 有什么办法能在浏览器上运行node代码?

  • 说下对process.env环境变量的理解

  • 说下nodejs中的事件循环和浏览器中的事件循环区别

  • 怎么定位和解决nodejs环境中的内存泄露?

  • 说下nodejs中的进程和线程

  • nodejs中如何实现用户鉴权?

  • a.js 和 b.js 两个文件互相 require 是否会死循环? 双方是否能导出变量? 如何从设计上避免这种问题? [more]

  • 如果 a.js require 了 b.js, 那么在 b 中定义全局变量 t = 111 能否在 a 中直接打印出来? [more]

  • 如何在不重启 node 进程的情况下热更新一个 js/json 文件? 这个问题本身是否有问题? [more]

  • Promise 中 .then 的第二参数与 .catch 有什么区别? [more]

  • Eventemitter 的 emit 是同步还是异步? [more]

  • 如何判断接口是否异步? 是否只要有回调函数就是异步? [more]

  • nextTick, setTimeout 以及 setImmediate 三者有什么区别? [more]

  • 如何实现一个 sleep 函数? [more]

  • 如何实现一个异步的 reduce? (注:不是异步完了之后同步 reduce) [more]

  • 进程的当前工作目录是什么? 有什么作用? [more]

  • child_process.fork 与 POSIX 的 fork 有什么区别? [more]

  • 父进程或子进程的死亡是否会影响对方? 什么是孤儿进程? [more]

  • cluster 是如何保证负载均衡的? [more]

  • 什么是守护进程? 如何实现守护进程? [more]

  • Buffer 一般用于处理什么数据? 其长度能否动态变化? [more]

  • Stream 的 highWaterMark 与 drain 事件是什么? 二者之间的关系是? [more]

  • Stream 的 pipe 的作用是? 在 pipe 的过程中数据是引用传递还是拷贝传递? [more]

  • 什么是文件描述符? 输入流/输出流/错误流是什么? [more]

  • console.log 是同步还是异步? 如何实现一个 console.log? [more]

  • 如何同步的获取用户的输入? [more]

  • Readline 是如何实现的? (有思路即可) [more]

  • cookie 与 session 的区别? 服务端如何清除 cookie? [more]

  • HTTP 协议中的 POST 和 PUT 有什么区别? [more]

  • 什么是跨域请求? 如何允许跨域? [more]

  • TCP/UDP 的区别? TCP 粘包是怎么回事,如何处理? UDP 有粘包吗? [more]

  • TIME_WAIT 是什么情况? 出现过多的 TIME_WAIT 可能是什么原因? [more]

  • ECONNRESET 是什么错误? 如何复现这个错误?

  • socket hang up 是什么意思? 可能在什么情况下出现? [more]

  • hosts 文件是什么? 什么叫 DNS 本地解析?

  • 列举几个提高网络传输速度的办法?

  • 什么是 TTY? 如何判断是否处于 TTY 环境? [more]

  • 不同操作系统的换行符 (EOL) 有什么区别? [more]

  • 服务器负载是什么概念? 如何查看负载? [more]

  • ulimit 是用来干什么的? [more]

  • 怎么处理未预料的出错? 用 try/catch ,domains 还是其它什么? [more]

  • 什么是 uncaughtException 事件? 一般在什么情况下使用该事件? [more]

  • domain 的原理是? 为什么要弃用 domain? [more]

  • 什么是防御性编程? 与其相对的 let it crash 又是什么?

  • 为什么要在 cb 的第一参数传 error? 为什么有的 cb 第一个参数不是 error, 例如 http.createServer?

  • 为什么有些异常没法根据报错信息定位到代码调用? 如何准确的定位一个异常? [more]

  • 内存泄漏通常由哪些原因导致? 如何分析以及定位内存泄漏? [more]

  • 为什么要写测试? 写测试是否会拖累开发进度?[more]

  • 单元测试的单元是指什么? 什么是覆盖率?[more]

  • 测试是如何保证业务逻辑中不会出现死循环的?[more]

  • mock 是什么? 一般在什么情况下 mock?[more]

  • HTTP 如何通过 GET 方法 (URL) 传递 let arr = [1,2,3,4] 给服务器? [more]

  • Node.js 中继承 (util.inherits) 的实现? [more]

  • 如何递归获取某个文件夹下所有的文件名? [more]

  • 备份数据库与 M/S, M/M 等部署方式的区别? [more]

  • 索引有什么用,大致原理是什么? 设计索引有什么注意点? [more]

  • Monogdb 连接问题(超时/断开等)有可能是什么问题导致的? [more]

  • 什么情况下数据会出现脏数据? 如何避免? [more]

  • redis 与 memcached 的区别? [more]

  • 加密是如何保证用户密码的安全性? [more]

  • TLS 与 SSL 有什么区别? [more]

  • HTTPS 能否被劫持? [more]

  • XSS 攻击是什么? 有什么危害? [more]

  • 过滤 Html 标签能否防止 XSS? 请列举不能的情况? [more]

  • CSRF 是什么? 如何防范? [more]

  • 如何避免中间人攻击? [more]

参考:

Node.js 教程

Node.js 教程W3C

七天学会NodeJS

Express 中文网
Koa中文文档

Nest中文文档