💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
https://vue3js.cn/interview/NodeJS/nodejs.html#%E4%B8%80%E3%80%81%E6%98%AF%E4%BB%80%E4%B9%88 ### NodeJS中事件循环 **定时器不准** ### nodeJs常用的内置模块、内置api ```js (1) URL网址解析 -- 解析URL相关网址信息 url.parse(urlString[, parseQueryString[, slashesDenoteHost]]) url.format(urlObject) url.resolve(from, to) (2) QueryString参数处理 querystring.escape(str) querystring.unescape(str) querystring.parse(str[, sep[, eq[, options]]]) querystring.stringify(obj[, sep[, eq[, options]]]) (3) HTTP模块概要 http.createServer([options][, requestListener]) 启动服务 http.get(options[, callback]) 简易的爬虫;代理跨域处理 (4) 事件 events 模块 (5) 文件fs模块 -- 打印目录树 (6) Stream 流模块: 歌词播放;音乐下载 (8) request 方法 ``` ### Node.js 中的 Event Emitter Node.js 的每个API都是异步的,并作为一个独立线程运行,使用异步函数调用。大部分事件机制是用**观察者模式**实现。Node.js中有多个内置事件,通过引入events模块,实例化EventEmitter类来绑定和监听事件。 **EventEmitter属性:** * `on(event, listener)`:注册一个监听器,绑定事件,接受一个字符串event 和一个回调函数。 * `emit(event, [arg1], [arg2], [...])`:触发一个事件,按参数的顺序执行每个监听器,如果事件有注册监听则返回true, 否则返回false。 * `addEventListener(event, listener)`:为指定事件添加一个监听器到监听器数组的尾部。 * `once(event, listener)`: 为指定事件注册一个单次监听器,即监听器最多只能触发一次,触发后立即解除该监听器。 * `removeListener(event, listener)`:移除指定事件的某个监听器,监听器必须是该事件已经注册过的。 EventEmitter的每个事件由一个事件名和若干参数组成。 对于每个事件,EventEmitter支持若干个事件监听器。当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。 ```js var events = require('events'); var emitter = new events.EventEmitter(); emitter.on('someEvent', function(arg1, arg2) { console.log('listener1', arg1, arg2); }); emitter.on('someEvent', function(arg1, arg2) { console.log('listener2', arg1, arg2); }); emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); ``` ### readFile 和 createReadStream 的区别 fs模块对文件的几乎所有操作都有同步和异步两种形式,同步调用会阻塞代码的执行,异步调用会将读取任务下达到任务队列,直到任务执行完成才会回调 例如:readFile() 和 readFileSync() >readFile 函数异步读取文件的全部内容,并存储在内存中,然后再传递给用户。 createReadStream 使用一个可读的流,逐块读取文件,而不是全部存储在内存中。使用更少的内存和更快的速度来优化文件读取操作 ```js const fs = require("fs"); fs.readFile("test.txt", (err, content) => { console.log(content) }) ``` ### 异步和非阻塞 nodejs 是基于驱动事件的非阻塞I/O模型,node的api 都支持回调函数 同步与异步---更面向非IO代码; 阻塞与非阻塞----更面向IO代码 - 同步:必须等待上一个函数执行完毕,才能继续向下执行 - 异步:主线程执行到类IO操作时,会调用底层封装的libuv分配线程执行,并放入队列中等待主线程循环事件抽取 - 阻塞:必须等待前一个得到结果后才能继续执行,和同步容易混淆,但阻塞主要是IO操作 ## **pm2** [ pm2自动化部署node项目](https://juejin.cn/post/7046214076623487013) pm2(process manager)是一个进程管理工具,维护一个进程列表,可以用它来管理你的node进程,负责所有正在运行的进程,并查看node进程的状态,也支持性能监控,负载均衡等功能。 ### 使用pm2管理的node程序的好处 1. 支持性能监控 2. 负载均衡 3. 自动重启:生产环境监听文件变化、程序崩溃时、服务器重新启动时 4. 自动化部署项目 ### pm2基本命令 ``` pm2 start app.js -i 4 // 启动4个app.js; 也可把max参数给start; 正确的进程数目依赖于Cpu核数 pm2 start app.js --name my-api // 命名进程 pm2 start ecosystem.config.js --env dev // 运行生产环境 pm2 list // 显示所有进程状态 pm2 monit // 监视每个node进程的CPU和内存的使用情况 pm2 logs // 显示所有进程日志 pm2 stop all // 停止所有进程 pm2 restart all // 重启所有进程 pm2 reload all // 0秒停机重载进程 (用于 NETWORKED 进程) pm2 stop 0 // 停止指定的进程 pm2 restart 0 // 重启指定的进程 pm2 startup // 产生 init 脚本 保持进程活着 pm2 web // 运行健壮的 computer API endpoint pm2 delete 0 // 杀死指定的进程 pm2 delete all // 杀死全部进程12345678910111213141516 ``` ### pm2部署nodejs服务 项目根目录下新建一个 deploy.yaml 文件 ```yaml apps: - script: ./start.js # 入口文件 name: 'app' # 程序名称 env: # 环境变量 COMMON_VARIABLE: true env_production: NODE_ENV: production deploy: # 部署脚本 production: # 生产环境 user: lentoo # 服务器的用户名 host: 192.168.2.166 # 服务器的ip地址 port: 22 # ssh端口 ref: origin/master # 要拉取的git分支 ssh_options: StrictHostKeyChecking=no # SSH 公钥检查 repo: https://github.com/**.git # 远程仓库地址 path: /home # 拉取到服务器某个目录下 pre-deploy: git fetch --all # 部署前执行 post-deploy: npm install && pm2 reload deploy.yaml --env production # 部署后执行 env: NODE_ENV: production ``` 每次部署前先将本地的代码提交到远程git仓库 * 首次部署 `pm2 deploy deploy.yaml production setup` 部署完成后,既可登陆服务器查看配置的目录下是否从git上拉取了项目 * 再次部署 `pm2 deploy deploy.yaml production update`