基础模块
全局对象
Nodejs 中的全局对象是 global。 下面给出一些常见的全局对象:
- Class:Buffer
- process
- console
- clearInterval、setInterval
- clearTimeout、setTimeout
- global
模块系统
路由
内置模块
| 模块名称 | 描述 | 常用类/方法 | 典型用途 |
|---|---|---|---|
| fs (File System) | 文件系统操作 | readFile, writeFile, mkdir, readdir, createReadStream, createWriteStream | 文件读写、目录操作 |
| path | 处理文件路径 | join, resolve, dirname, basename, extname | 跨平台路径处理 |
| http | HTTP 服务器/客户端 | createServer, request, get | 创建Web服务器/客户端 |
| https | HTTPS 服务器/客户端 | createServer, request | 创建安全Web服务 |
| url | URL解析与处理 | parse, format, URL类 | URL解析和构造 |
| querystring | 查询字符串处理 | parse, stringify | 处理URL查询参数 |
| os | 操作系统信息 | cpus, freemem, totalmem, homedir, hostname | 获取系统信息 |
| events | 事件处理 | EventEmitter, on, emit, once | 自定义事件系统 |
| stream | 流操作 | Readable, Writable, Duplex, Transform, pipe | 处理数据流 |
| crypto | 加密功能 | createHash, createCipher, createDecipher, randomBytes | 加密/解密/哈希 |
| zlib | 压缩/解压 | createGzip, createGunzip, createDeflate, createInflate | 数据压缩解压 |
| util | 实用工具 | promisify, inherits, format, types | 工具函数 |
| child_process | 子进程管理 | exec, execFile, spawn, fork | 创建子进程 |
| cluster | 集群管理 | fork, isMaster, isWorker | 多进程负载均衡 |
| dns | 域名解析 | lookup, resolve, reverse | 域名解析 |
| domain | 处理多个异步操作错误的模块 | create , run, add | 提供了一种将多个不同的 I/O 操作分组并统一处理其错误的机制。 |
| net | 网络操作 | createServer, connect, Socket | TCP服务器/客户端 |
| dgram | UDP数据报 | createSocket, send, bind | UDP通信 |
| readline | 逐行读取 | createInterface, on('line') | 命令行交互 |
| repl | 交互式解释器 | start, context | 创建REPL环境 |
| vm | 虚拟机 | runInContext, createContext, Script | 执行JavaScript代码 |
| assert | 断言测试 | equal, strictEqual, deepEqual, throws | 单元测试断言 |
| buffer | 二进制数据处理 | Buffer, alloc, from, concat | 处理二进制数据 |
| console | 控制台输出 | log, error, time, timeEnd | 调试输出 |
| timers | 定时器 | setTimeout, setInterval, setImmediate, clearTimeout | 定时任务 |
| perf_hooks | 性能监控 | performance, PerformanceObserver | 性能测量 |
| worker_threads | 工作线程 | Worker, isMainThread, parentPort | 多线程编程 |
常用框架
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]