理想是火,点燃熄灭的灯。
之前使用Github action来备份数据,每次都需要使用ssh 登录服务器,
但是有时候会登录超时(因为git的ip地址是美国的,我的服务器又是国内的,服务器会报警),导致备份数据失败
所以思考了一下,能不能使用node api来执行备份数据的操作??
这样的话node api的上下文就是自己的服务器 也不需要ssh这种登录的东西了!
简直快捷又方便
本质就是通过node来执行shell命令行
直接开搞
主要是使用child_process的中的exec
const { exec } = require("child_process"); const { promisify } = require("util"); const execAsync = promisify(exec);
promisify是当node中一些标准的call方法封装成异步函数的 方便去awiat
比如fs.readFile(),exec() 等等标准node自带方法 注意:是标准格式,自己写也要严重遵循node的方法输出和输入标准,
不建议自己写方法然后通过promisify去套,不如自己套promise去套
const { exec } = require("child_process"); const { promisify } = require("util"); const execAsync = promisify(exec); router.post("/backup", async (ctx) => { const dbUser = `xxxxx`; const dbPass = `xxxxxx`; const command = `cd /xxx/xxx/mongodb/bin/ && ./mongodump -h 127.0.0.1:27017 -d xx-o xxx -u "${dbUser}" -p "${dbPass}"`; try { const { stdout, stderr } = await execAsync(command); ctx.body = { success: true, message: "数据备份成功", output: stdout, warning: stderr || null, }; } catch (error) { ctx.status = 500; ctx.body = { success: false, message: "数据备份失败", error: error.message, }; } });
注意:这里的await execAsync(command); 其实不是等待数据备份完成,而是等待命令执行完成,具体的相关信息在stdout和stderr 中
它并不会“知道”你这个命令是否 备份成功,它只是执行你拼接的 mongodump
命令,并返回执行过程中的标准输出 (stdout
) 和标准错误 (stderr
)。如果命令执行过程中出现错误(例如 mongodump 执行失败),execAsync
会抛出异常(因为 exec
遵循的是 Node.js 的标准回调格式:(error, stdout, stderr)
,而 promisify
会自动把 error 转成 Promise reject)。
这样我们就实现了通过调用我们自己的服务来备份数据的操作了
具体的mongodb备份的文章可以参考:http://biaoblog.cn/info?id=1628044347419
作者: Bill 本文地址: http://biaoblog.cn/info?id=1746322596292
版权声明: 本文为原创文章,版权归 biaoblog 个人博客 所有,欢迎分享本文,转载请保留出处,谢谢!
上一篇:没有了