adminjs备份数据库

AdminJS 7 提供了一个模块化的插件 adminjs-plugin-mongoose 来与 Mongoose 集成,您可以使用该插件来轻松备份 MongoDB 数据库。以下是基本的使用步骤:

  1. 安装 adminjs-plugin-mongoose 插件:
npm install adminjs-plugin-mongoose
  1. 在 AdminJs 中引入 adminjs-plugin-mongoose 并注册到 AdminJS application 实例中。例如:
const mongoose = require('mongoose');
const AdminJS = require('adminjs');
const adminjsMongoose = require('adminjs-plugin-mongoose');

const MONGO_URI = 'mongodb://localhost:27017/test';

const connectDB = async () => {
  try {
    await mongoose.connect(MONGO_URI, { useNewUrlParser: true });
    console.log('MongoDB connected…');
  } catch (err) {
    console.log(err);
  }
}

connectDB();

const User = mongoose.model('User', {
  email: String,
  password: String,
});

AdminJS.registerAdapter(require('adminjs-mongoose'));

const adminJsOptions = {
  resources: [User],
};

const adminJs = new AdminJS(adminJsOptions);

app.use(adminJs.options.rootPath, adminJs.options.router);

在调用 adminJsOptions 时,User 向 resource 数组中添加两个属性:email 和 password。这就是我们将要备份的集合。

  1. 创建一个新的路由 handler 来处理备份请求,备份到指定的目录。例如:
const fs = require('fs');
const os = require('os');
const path = require('path');
const rimraf = require('rimraf');
const carbone = require('carbone');
const moment = require('moment');

app.get('/backup', async (req, res) => {
  const backupFolder = fs.mkdtempSync(
    path.join(os.tmpdir(), 'adminjs-backup-'));
  // Create a new folder with a unique path name
  console.log('Backup in folder:', backupFolder);
  try {
    await User.backup(backupFolder);

    const fileName = `User-${moment().format('YYMMDD_HHmmss')}.zip`;
    const filePath = path.resolve(path.join(backupFolder, '..', fileName));

    Carbone.render(path.join(__dirname, '../views/backup.odt'), { filename: fileName })
      .then(async (result) => {
        fs.writeFileSync(filePath, result);

        res.download(filePath);
        console.log('File downloaded successfully.');
      });
  } catch (error) {
    console.log(error);

    rimraf.sync(`${backupFolder}/*`);
    res.status(400).send({
      message: error.message,
    });
  }
});

在上述 JavaScript 代码中,我们创建了一个新的路由处理程序,该处理程序创建一个临时文件夹,并在其中备份 User 集合。随后,我们使用 Rimraf 删除原始临时文件夹,以保持电脑磁盘空间的干净整洁。

  1. 在 AdminJS ui 上绑定生成的 download 请求,以便直接请求下载备份数据,并进行保存。例如:
const { exposeAction } = require('@adminjs/express');
...
adminJs.route({
  method: 'GET',
  path: '/backup-data',
  handler: exposeAction('backup', (req, res, context) => {
      return {
        ...context,
        record: {},
      }
    },
  ), // Pass the user collection to the backup action
});

这部分代码是在 AdminJS 实例之后进行的,我们将 backup 的操作方法暴露为一个 /backup-data(可替换) 的 Express 路由。

最后,在 adminjs ui 上创建一个按钮,触发 GET 请求:

{
  components: [{
    name: 'Download Backup',
    type: 'Button',
    props: {
      as: 'a',
      target: '_blank',
      href: '/admin/backup-data',
    },
    isVisible:{ $is: {'..navigation.main': 'Data'}},
  }],
},

在以上 JavaScript 代码中,我们成功将名为“Download Backup”的按钮添加到 AdminJS UI 的主菜单中,并设置了与刚才定义的路由相对应的 HTTPS GET 映射关系。

这是您的 AdminJS 7 数据库备份所需的全部步骤。该示例可实现以下操作:

安排从 MongoDB 的 User 集合中备份数据

给定一个或多个按钮上,通过 AdminJS UI 触发备份操作,并在备份完成后下载备份文件

总结:使用 adminjs-plugin-mongoose 模块,您可以轻松地将 MongoDB 数据库备份到本地硬盘或云端存储区域,以保证对系统数据的可靠性和持续访问能力。获取过程需要仔细审查,同时理解如何调用 Mongoose API 来执行数据库备份并存储结果,以此来达到安全备份和快速恢复丢失的数据的目的。

作者

Nick

发布于

2023-06-13

更新于

2023-10-21

许可协议

评论