经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Node.js » 查看文章
Node + Express 后台开发 —— 上传、下载和发布
来源:cnblogs  作者:彭加李  时间:2023/5/10 9:23:50  对本文有异议

上传、下载和发布

前面我们已经完成了数据库的增删改查,在弄一个上传图片、下载 csv,一个最简单的后台开发就已完成,最后部署即可。

上传图片

需求

需求:做一个个人简介的表单提交,有昵称简介头像。后端能接收数据并保存到数据库。

接收不到数据

amis-editor(amis 低代码编辑器,更多了解请看这里)绘制一个如下界面:

前端上传文件使用 InputFile 的手动上传。配置如下:

  1. {
  2. "type": "input-file",
  3. "name": "file",
  4. "label": "File",
  5. "accept": "*",
  6. "asBlob": true
  7. }

后端定义一个路由:

  1. // 个人简介
  2. // http://localhost:3000/users/upload
  3. router.post('/upload', function(req, res, next) {
  4. console.log('req', req.body)
  5. res.send({"status":0,"msg":"","data":{}});
  6. });

输入信息后提交,后端 req.body 是空对象,说明无法接收数据:

  1. req {}
  2. POST /users/upload 200 6.230 ms - 31

前端传输数据如下:

如果前端不传文件,后端 req.body 则能正常接收数据:

  1. req { nickname: 'pjl', introduction: 'i am pjl', file: '' }
  2. POST /users/upload 200 26.287 ms - 31

TipContent-Type 用于指示资源的 MIMIE 类型,请求中,客户端告诉服务器实际发送的数据类型。相应中,告诉客户端发送的内容的内容类型。不传文件请求头的 Content-Type 是 Content-Type: application/json;传了文件,请求头的 Content-Type 是 Content-Type: multipart/form-data; boundary=----。需要在表单中进行文件上传时,就需要使用该格式:multipart/form-data

multer

Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件。
:Multer 不会处理任何非 multipart/form-data 类型的表单数据

安装 multer

  1. PS E:\pjl-back-end> npm install --save multer
  2. added 17 packages, and audited 119 packages in 18s
  3. 3 packages are looking for funding
  4. run `npm fund` for details
  5. 4 vulnerabilities (3 high, 1 critical)
  6. To address all issues (including breaking changes), run:
  7. npm audit fix --force
  8. Run `npm audit` for details.

使用 multer:

  1. PS E:\pjl-back-end> git diff routes/users.js
  2. +const multer = require('multer')
  3. +// 启动服务后,自动在 public 下创建 uploads 文件夹
  4. +const upload = multer({ dest: 'public/uploads/' })
  5. +// 一旦请求过来,就会先经过中间件把接收到的图片存入 uploads 文件夹中,然后在到下一步
  6. +// file 是前端文件的 name。由于这里是一张图片,所以用 single 方法。多张图片的使用请看文档
  7. +router.post('/upload', upload.single('file'), function(req, res, next) {
  8. + // req.body 将具有文本域数据,如果存在的话
  9. + console.log(req.body)
  10. + // req.file 是 `file` 文件的信息
  11. + console.log(req.file)
  12. res.send({"status":0,"msg":"","data":{}});
  13. });

启动服务后,会自动在 public 下创建 uploads 文件夹。输入昵称、简介和头像,点击提交。头像文件会重命名并上传到 uploads 中,通过 req.body 可以取得昵称和简介,通过 req.file 可以取得文件信息。后续存入数据库的操作笔者就不在进行,无非就是通过 token 取得用户 id,然后将昵称、简介和头像路径传给 services,通过 model 保存到数据库。

Tip:虽然文件没有了后缀(.png),通过chrome 直接访问图片路径(http://localhost:3000/uploads/36d8bda3160d8d09e81b167de1969b47)会自动下载,把图片路径给到 image 是可以正常使用。

下载csv

需求

需求:点击导出全部按钮,发起请求,通过后端直接下载 csv 文件,里面是表格数据。

实现

安装 json2csv 包,用于将数据库中查询的 json 转为 csv:

  1. PS E:\pjl-back-end> npm install json2csv
  2. added 4 packages, and audited 123 packages in 4s
  3. 3 packages are looking for funding
  4. run `npm fund` for details
  5. 4 vulnerabilities (3 high, 1 critical)
  6. To address all issues (including breaking changes), run:
  7. npm audit fix --force
  8. Run `npm audit` for details.
  9. PS E:\pjl-back-end>

安装 iconv-lite 用于编码转换:

  1. PS E:\pjl-back-end> npm i iconv-lite
  2. added 2 packages, changed 1 package, and audited 125 packages in 3s
  3. 3 packages are looking for funding
  4. run `npm fund` for details
  5. 4 vulnerabilities (3 high, 1 critical)
  6. To address all issues (including breaking changes), run:
  7. npm audit fix --force
  8. Run `npm audit` for details.

新建 utils.js,导出 downloadResource 方法用于下载 csv:

  1. // E:\pjl-back-end\libs\utils.js
  2. const Parser = require('json2csv').Parser;
  3. const downloadResource = (res, fileName, fields, data) => {
  4. const json2csv = new Parser({ fields });
  5. const csv = json2csv.parse(data);
  6. // iconv-lite: Pure JS character encoding conversion 转码,防止中文乱码
  7. const iconv = require('iconv-lite');
  8. const newCsv = iconv.encode(csv, 'gbk')
  9. res.header('Content-Type', 'text/csv');
  10. res.attachment(fileName);
  11. return res.send(newCsv);
  12. }
  13. module.exports = {
  14. downloadResource,
  15. }

在任意路由中增加下载的处理请求:

  1. const downloadResource = require('../libs/utils').downloadResource;
  2. router.get('/download', function(req, res, next) {
  3. // 列名
  4. const fields = [
  5. {
  6. label: '姓名',
  7. value: 'name'
  8. },
  9. {
  10. label: '年龄',
  11. value: 'age'
  12. },
  13. ];
  14. // 模拟从数据库查询出的数据
  15. const data = [
  16. { "name":"peng 彭", "age": 18},
  17. { "name":"jia 加", "age": 19},
  18. { "name":"li 李", "age": 20},
  19. { "name":"pjl 彭加李", "age": 21},
  20. ];
  21. return downloadResource(res, 'users.csv', fields, data);
  22. });

重启服务,浏览器输入 localhost:3000/users/download 回车后会自动下载 csv 文件。双击打开 csv,效果如下:

如果不转码处理,这里 csv 中的中文就会乱码。

疑惑:网上说 gbk和utf8都是都能编码中英文。将 gbk 改为 utf8,在 win7 中打开 csv 仍旧乱码,或许是win7 中打开csv是gbk,得保持客户端和服务器编码一致?

发布

pm2

假如 node 项目已经开发完毕,得将应用部署到服务器中。

直接使用 node app.js 一旦关闭终端,服务就会中断

虽然也可以使用 node app.js & 后台启动服务,但也有很多不足,比如重新发布代码不会自动生效

Tip: windows 下关闭后台启动的服务,比如端口是 3000

  1. PS E:\pjl-back-end> netstat -ano|findstr 3000
  2. TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 12384
  3. TCP [::]:3000 [::]:0 LISTENING 12384
  4. TCP [::1]:3000 [::1]:10229 TIME_WAIT 0
  5. TCP [::1]:10230 [::1]:3000 TIME_WAIT 0
  6. PS E:\pjl-back-end> taskkill /PID 12384 /F
  7. 成功: 已终止 PID 12384 的进程。

nodemon app.js 常用于开发环境

笔者这里使用 pm2。有如下好处:

  • 监控服务资源
  • 发布代码、宕机后会自动重启
  • 比如你的是cpu 是4核,也能充分利用
  • 能查看日志

体验 pm2

全局安装 pm2

  1. PS E:\pjl-back-end> npm install pm2 -g
  2. npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
  3. added 184 packages, and audited 185 packages in 25s
  4. 12 packages are looking for funding
  5. run `npm fund` for details
  6. found 0 vulnerabilities
  7. PS E:\pjl-back-end> pm2 list

下面我们使用 pm2 启动服务:

Tip: 笔者由于环境问题,使用 npx 运行 pm2。你们可以省略。

查看版本

通过 pm2 --version 查看版本,说明安装成功:

  1. PS E:\pjl-back-end> npx pm2 --version
  2. 5.3.0
启动服务

通过 pm2 start 入口文件 启动服务:

  1. PS E:\pjl-back-end> npx pm2 start ./bin/www
  2. [PM2] Starting E:\pjl-back-end\bin\www in fork_mode (1 instance)
  3. [PM2] Done.
  4. ┌────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──
  5. ────────┬──────────┐
  6. id name namespace version mode pid uptime ? status cpu mem user watching
  7. ├────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──
  8. ────────┼──────────┤
  9. 0 www default 0.0.0 fork 9904 0s 0 online 0% 42.0mb Adm disabled
  10. └────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──
  11. ────────┴──────────┘

应用的 id 是 0,name 是 www,后续删除、启动和重启应用使用 id 和 name 都可以。

? 表示重启次数为0。后续重启应用会自动增加。

status 中的 online 表示已上线。

服务列表

通过 pm2 list 显示应用列表,比如目前有一个服务(www)已启动(online):

  1. PS E:\pjl-back-end> npx pm2 list
  2. ┌────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──
  3. ────────┬──────────┐
  4. id name namespace version mode pid uptime ? status cpu mem user watching
  5. ├────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──
  6. ────────┼──────────┤
  7. 0 www default 0.0.0 fork 9904 2m 0 online 0% 57.9mb Adm disabled
  8. └────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──
  9. ────────┴──────────┘
重启服务

通过 pm2 restart id|name 重启服务:

  1. // 通过 id 重启
  2. PS E:\pjl-back-end> npx pm2 restart 0
  3. Use --update-env to update environment variables
  4. [PM2] Applying action restartProcessId on app [0](ids: [ '0' ])
  5. [PM2] [www](0) ?
  6. ┌────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──
  7. ────────┬──────────┐
  8. id name namespace version mode pid uptime ? status cpu mem user watching
  9. ├────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──
  10. ────────┼──────────┤
  11. 0 www default 0.0.0 fork 12088 0s 1 online 0% 41.9mb Adm disabled
  12. └────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──
  13. ────────┴──────────┘
  14. // 通过 name 重启
  15. PS E:\pjl-back-end> npx pm2 restart www
  16. Use --update-env to update environment variables
  17. [PM2] Applying action restartProcessId on app [www](ids: [ 0 ])
  18. [PM2] [www](0) ?
  19. ┌────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──
  20. ────────┬──────────┐
  21. id name namespace version mode pid uptime ? status cpu mem user watching
  22. ├────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──
  23. ────────┼──────────┤
  24. 0 www default 0.0.0 fork 6648 0s 2 online 0% 40.9mb Adm disabled
  25. └────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──

Tip: ? 表示重启过几次了

应用详情

pm2 info www 查看 www 这个应用的详细信息:

  1. PS E:\pjl-back-end> npx pm2 info www
  2. Describing process with id 0 - name www
  3. ┌───────────────────┬────────────────────────────────────────────────┐
  4. status online
  5. name www
  6. namespace default
  7. version 0.0.0
  8. restarts 2
  9. uptime 62s
  10. script path E:\pjl-back-end\bin\www
  11. script args N/A
  12. error log path C:\Users\Administrator\.pm2\logs\www-error.log
  13. out log path C:\Users\Administrator\.pm2\logs\www-out.log
  14. pid path C:\Users\Administrator\.pm2\pids\www-0.pid
  15. interpreter node
  16. interpreter args N/A
  17. script id 0
  18. exec cwd E:\pjl-back-end
  19. exec mode fork_mode
  20. node.js version 16.20.0
  21. node env N/A
  22. watch & reload ?
  23. unstable restarts 0
  24. created at 2023-05-09T07:28:11.550Z
  25. └───────────────────┴────────────────────────────────────────────────┘
  26. Revision control metadata
  27. ┌──────────────────┬──────────────────────────────────────────┐
  28. revision control git
  29. remote url N/A
  30. repository root E:\pjl-back-end
  31. last update 2023-05-09T07:28:12.179Z
  32. revision a02f7d6427fde5fdce41aff1626d31c19d80fcdf
  33. comment 取消数据库和登录标识
  34. branch master
  35. └──────────────────┴──────────────────────────────────────────┘
  36. Actions available
  37. ┌────────────────────────┐
  38. km:heapdump
  39. km:cpu:profiling:start
  40. km:cpu:profiling:stop
  41. km:heap:sampling:start
  42. km:heap:sampling:stop
  43. └────────────────────────┘
  44. Trigger via: pm2 trigger www <action_name>
  45. Code metrics value
  46. ┌────────────────────────┬───────────┐
  47. Used Heap Size 20.15 MiB
  48. Heap Usage 89 %
  49. Heap Size 22.64 MiB
  50. Event Loop Latency p95 2.04 ms
  51. Event Loop Latency 0.08 ms
  52. Active handles 4
  53. Active requests 0
  54. └────────────────────────┴───────────┘
  55. Divergent env variables from local env
  56. Add your own code metrics: http://bit.ly/code-metrics
  57. Use `pm2 logs www [--lines 1000]` to display logs
  58. Use `pm2 env 0` to display environment variables
  59. Use `pm2 monit` to monitor CPU and Memory usage www
监控应用

通过 pm2 monit id|name 监控应用程序:

  1. PS E:\pjl-back-end> npx pm2 monit www
  2. ┌─ Process List ───────────────────────── www Logs ─────────────────┐┌─ Logs ───────────────────────────────────────────────
  3. [ 0] www Mem: 59 MB CPU: 0 % online www > 错误信息
  4. www > GET /users/testlog 304 1.186 ms - -
  5. www > 信息
  6. www > 错误信息
  7. www > GET /users/testlog 304 1.837 ms - -
  8. www > 信息
  9. www > GET /users/testlog 304 0.914 ms - -
  10. www > 错误信息
  11. www > 信息
  12. www > 错误信息
  13. www > GET /users/testlog 304 1.369 ms - -
  14. www > 信息
  15. www > 错误信息
  16. www > GET /users/testlog 304 1.733 ms - -
  17. www > 信息
  18. www > 错误信息
  19. www > GET /users/testlog 304 3.095 ms - -
  20. └─────────────────────────────────────────────────────────────────┘└────────────────────────────────────────────
  21. ┌─ Custom Metrics ────────────────────────────────────────────────┐┌─ Metadata ──────────────────────────────────────────────
  22. Used Heap Size 20.94 MiB App Name www
  23. Heap Usage 91.45 % Namespace default
  24. Heap Size 22.89 MiB Version 0.0.0
  25. Event Loop Latency p95 9.12 ms Restarts 2
  26. Event Loop Latency 0.14 ms Uptime 2m
  27. └─────────────────────────────────────────────────────────────────┘└────────────────────────────────────────────
  28. left/right: switch boards | up/down/mouse: scroll | Ctrl-C: exit To go further check out https://pm2.io/

Tip:日志信息也会同步输出,日志就是console.log 或 console.error输出的内容,下文配置 pm2会讲到。

停止应用

通过 pm2 stop id|name 停止服务:

  1. PS E:\pjl-back-end> npx pm2 stop www
  2. [PM2] Applying action stopProcessId on app [www](ids: [ 0 ])
  3. [PM2] [www](0) ?
  4. ┌────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──
  5. ────────┬──────────┐
  6. id name namespace version mode pid uptime ? status cpu mem user watching
  7. ├────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──
  8. ────────┼──────────┤
  9. 0 www default 0.0.0 fork 0 0 2 stopped 0% 0b Adm disabled
  10. └────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──
  11. ────────┴──────────┘
关闭并删除应用

通过 pm2 delete id|name 关闭并删除应用:

  1. PS E:\pjl-back-end> npx pm2 delete www
  2. [PM2] Applying action deleteProcessId on app [www](ids: [ 0 ])
  3. [PM2] [www](0) ?
  4. ┌────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────
  5. ┬──────────┬──────────┐
  6. id name namespace version mode pid uptime ? status cpu mem user watching
  7. └────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────
  8. ┴──────────┴──────────┘
稳定的服务

比如笔者写一个如下服务 app2.js:

  1. // app2.js
  2. const http = require('http')
  3. const fs = require('fs')
  4. const server = http.createServer()
  5. const requestListener = (req, res) => {
  6. const url = req.url
  7. // 如果url是 '/',则返回主页
  8. if(url === '/'){
  9. res.end("home page")
  10. }else if(url === '/b'){
  11. res.end("page b")
  12. }else if(url === '/error'){
  13. throw new Error('故意报错')
  14. }
  15. }
  16. server.on('request', requestListener)
  17. server.listen('3000', () => {
  18. console.log('服务器已启动')
  19. })

通过 node app2.js 启动服务后,访问 localhost:3000/error 故意报错,服务就会死掉,无法在响应其他请求:

  1. PS E:\pjl-back-end> node app2.js
  2. 服务器已启动
  3. E:\pjl-back-end\app2.js:13
  4. throw new Error('故意报错')
  5. ^
  6. Error: 故意报错
  7. at Server.requestListener (E:\pjl-back-end\app2.js:13:15)
  8. at Server.emit (node:events:513:28)
  9. at parserOnIncoming (node:_http_server:998:12)
  10. at HTTPParser.parserOnHeadersComplete (node:_http_common:128:17)

如果改用 pm2 启动服务:

  1. PS E:\pjl-back-end> npx pm2 start app2.js
  2. [PM2] Starting E:\pjl-back-end\app2.js in fork_mode (1 instance)
  3. [PM2] Done.
  4. ┌────┬─────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬─
  5. ─────────┬──────────┐
  6. id name namespace version mode pid uptime ? status cpu mem user watching
  7. ├────┼─────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼─
  8. ─────────┼──────────┤
  9. 0 app2 default 0.0.0 fork 12248 0s 0 online 0% 40.2mb Adm disabled
  10. └────┴─────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴─
  11. ─────────┴──────────┘

再次访问 localhost:3000/error,通过 pm2 list 发现重启(?)次数从0变成了3,总之是重启了:

  1. PS E:\pjl-back-end> npx pm2 list
  2. ┌────┬─────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬─
  3. ─────────┬──────────┐
  4. id name namespace version mode pid uptime ? status cpu mem user watching
  5. ├────┼─────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼─
  6. ─────────┼──────────┤
  7. 0 app2 default 0.0.0 fork 12196 25s 3 online 0% 39.7mb Adm disabled
  8. └────┴─────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴─

访问 http://localhost:3000/ 页面显示 home page,说明服务正常,也较之前更稳定。

配置 pm2

需求

需求:配置应用名称入口文件监控日志实例数

代码

项目根目录新建 pm2 配置文件 pm2.config.json

  1. {
  2. "apps": {
  3. // 应用名称
  4. "name": "spug-back-end",
  5. // 入口文件
  6. "script": "./bin/www",
  7. // 监控。修改代码后自动生效
  8. "watch": true,
  9. // 排除某些文件的监控
  10. "ignore_watch": [
  11. "node_modules",
  12. "logs"
  13. ],
  14. // 错误日志。通过 console.error() 输出
  15. "error_file": "logs/error.log",
  16. // 自定义日志。通过 console.log() 输出
  17. "out_file": "logs/custom.log",
  18. // 给日志添加时间。否则你得这么写 console.log('信息...', '2023-05-09 16:25:00')
  19. // YYYY不要小写
  20. "log_date_format": "YYYY-MM-DD HH:mm:ss",
  21. // cpu 核数。不要超过服务器的 cpu 核数
  22. // 笔者 cpu 核数是 2,这样会启动 2 个服务,能更好的利用服务器资源。
  23. "instances": 2
  24. }
  25. }

Tip:windows 查看 CPU 核数 - 在 cmd 命令中输入 wmic,然后在出现的新窗口中输入 cpu get NumberOfCores

  1. PS E:\pjl-back-end> wmic
  2. wmic:root\cli>cpu get NumberOfCores
  3. NumberOfCores
  4. 2

修改 package.json(pm2 指定配置文件启动服务):

  1. // package.json
  2. "scripts": {
  3. "start": "nodemon ./bin/www",
  4. +"pro": "pm2 start ./pm2.config.json"
  5. },

增加如下路由,用于测试日志

  1. // localhost:3000/users/testlog
  2. router.get('/testlog', function(req, res, next) {
  3. // 输出到自定义日志中
  4. console.log('信息');
  5. // 输出到错误日志中
  6. console.error('错误信息');
  7. res.send({"status":0,"msg":"123","data":{}});
  8. });
测试

通过 npm run pro 启动服务:

  1. PS E:\pjl-back-end> npm run pro
  2. > pjl-back-end@0.0.0 pro
  3. > pm2 start ./pm2.config.json
  4. [PM2][WARN] Applications spug-back-end not running, starting...
  5. [PM2] App [spug-back-end] launched (2 instances)
  6. ┌────┬──────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬───
  7. ───────┬──────────┬──────────┐
  8. id name namespace version mode pid uptime ? status cpu mem user watching
  9. ├────┼──────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼───
  10. ───────┼──────────┼──────────┤
  11. 0 spug-back-end default 0.0.0 cluster 12496 0 1 stopped 0% 0b Adm enabled
  12. 1 spug-back-end default 0.0.0 cluster 11436 0 1 stopped 0% 0b Adm enabled
  13. └────┴──────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴───
  14. ───────┴──────────┴──────────┘
  15. // 启动后立刻执行
  16. PS E:\pjl-back-end> npx pm2 list
  17. ┌────┬──────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬───
  18. ───────┬──────────┬──────────┐
  19. id name namespace version mode pid uptime ? status cpu mem user watching
  20. ├────┼──────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼───
  21. ───────┼──────────┼──────────┤
  22. 0 spug-back-end default 0.0.0 cluster 1396 14s 1 online 0% 58.7mb Adm enabled
  23. 1 spug-back-end default 0.0.0 cluster 1704 14s 1 online 0% 58.7mb Adm enabled
  24. └────┴──────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴───
  25. ───────┴──────────┴──────────┘
  26. PS E:\pjl-back-end>

应用名是 spug-back-end

启动了两个应用,说明 "instances": 2 已生效。

logs 文件夹中生成了4个日志文件(每个cpu核就是两个),文件名也是我们配置的,目前日志内容都为空:

  1. $ ll logs
  2. total 0
  3. -rw-r--r-- 1 Administrator 197121 0 May 9 16:40 custom-0.log
  4. -rw-r--r-- 1 Administrator 197121 0 May 9 16:40 custom-1.log
  5. -rw-r--r-- 1 Administrator 197121 0 May 9 16:40 error-0.log
  6. -rw-r--r-- 1 Administrator 197121 0 May 9 16:40 error-1.log

访问 http://localhost:3000/ 页面显示正常:

  1. Express
  2. Welcome to Express

再次查看日志发现 custom-1.log 有内容,记录了着请求的详细信息。例如时间、请求的资源(/stylesheets/style.css):

  1. Administrator@3L-WK-10 MINGW64 /e/pjl-back-end (master)
  2. $ ll logs
  3. total 1
  4. -rw-r--r-- 1 Administrator 197121 0 May 9 16:40 custom-0.log
  5. -rw-r--r-- 1 Administrator 197121 144 May 9 16:42 custom-1.log
  6. -rw-r--r-- 1 Administrator 197121 0 May 9 16:40 error-0.log
  7. -rw-r--r-- 1 Administrator 197121 0 May 9 16:40 error-1.log
  8. Administrator@3L-WK-10 MINGW64 /e/pjl-back-end (master)
  9. $ cat logs/custom-1.log
  10. 2023-05-09 16:42:35: GET / 304 21.595 ms - -
  11. 2023-05-09 16:42:35: GET /stylesheets/style.css 304 3.358 ms - -

修改某请求响应:

  1. $ git diff routes/index.js
  2. router.get('/', function(req, res, next) {
  3. - res.render('index', { title: 'Express' });
  4. + res.render('index', { title: 'Express2' });
  5. });

再次访问 http://localhost:3000/ 修改信息自动生效:

  1. Express2
  2. Welcome to Express2

通过 npx pm2 list 发现服务自动重启了(? 1 -> 3):

  1. PS E:\pjl-back-end> npx pm2 list
  2. ┌────┬──────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬───
  3. ───────┬──────────┬──────────┐
  4. id name namespace version mode pid uptime ? status cpu mem user watching
  5. ├────┼──────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼───
  6. ───────┼──────────┼──────────┤
  7. 0 spug-back-end default 0.0.0 cluster 13868 89s 3 online 0% 60.5mb Adm enabled
  8. 1 spug-back-end default 0.0.0 cluster 11792 89s 3 online 0% 61.1mb Adm enabled
  9. └────┴──────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴───

再次查看日志,发现 custom-0.log 也有数据了,这里其实间接说明了一个负载均衡的问题,这两个应用都能提供服务。

  1. $ ll logs
  2. total 2
  3. -rw-r--r-- 1 Administrator 197121 228 May 9 16:46 custom-0.log
  4. -rw-r--r-- 1 Administrator 197121 144 May 9 16:42 custom-1.log
  5. -rw-r--r-- 1 Administrator 197121 0 May 9 16:40 error-0.log
  6. -rw-r--r-- 1 Administrator 197121 0 May 9 16:40 error-1.log

接着访问输出日志的请求:http://localhost:3000/users/testlog,发现在同一时刻(16:54:47)往 custom-0.log 输出了 信息,在 error-0.log 中输出了 错误信息:

  1. $ git diff logs
  2. --- a/logs/custom-0.log
  3. +++ b/logs/custom-0.log
  4. 2023-05-09 16:53:56: GET /users/testlog 304 14.507 ms - -
  5. +2023-05-09 16:54:47: 信息
  6. +2023-05-09 16:54:47: GET /users/testlog 304 9.892 ms - -
  7. --- a/logs/error-0.log
  8. +++ b/logs/error-0.log
  9. 2023-05-09 16:53:56: 错误信息
  10. +2023-05-09 16:54:47: 错误信息

原文链接:https://www.cnblogs.com/pengjiali/p/17385971.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号