egg 封装一个帮助我们把冗长的 URL 地址缩短成 8 个字符以内的短网址的方法

egg 封装一个帮助我们把冗长的 URL 地址缩短成 8 个字符以内的短网址的方法

五月 24, 2023 评论 10 阅读 691 点赞 1 收藏 0

在 Egg.js 中,我们可以使用插件来实现 URL 缩短功能,比如使用 egg-sequelize 插件和 shortid 库来实现短码生成和存储。以下是一个示例代码,在 Egg.js 中封装 URL 缩短方法:

首先,安装需要的依赖:

npm install --save egg-sequelize shortid

然后,在 config/plugin.js 文件中添加插件配置:

exports.sequelize = {
  enable: true,
  package: 'egg-sequelize',
};

exports.shortid = {
  enable: true,
  package: 'shortid',
};

在数据库中创建表格,并定义模型:

// app/model/short_url.js

module.exports = app => {
  const { STRING, INTEGER } = app.Sequelize;

  const ShortUrlModel = app.model.define('short_url', {
    id: { type: INTEGER, primaryKey: true, autoIncrement: true },
    url: STRING(1024),
    code: STRING(8),
    createdAt: { type: INTEGER, defaultValue() { return Date.now(); } },
    updatedAt: { type: INTEGER, defaultValue() { return Date.now(); } },
  });

  return ShortUrlModel;
};

在服务端实现 URL 缩短方法,并将其封装为一个 service:

// app/service/shorturl.js

const Service = require('egg').Service;

class ShortUrlService extends Service {
  
    async shortenUrl(url) {
      const { ctx } = this;
      const ShortUrlModel = ctx.model.ShortUrl;

      // 根据 URL 查询数据库中是否已经有对应的短码
      let shortUrl = await ShortUrlModel.findOne({ where: { url } });
      if (!shortUrl) {
        // 生成短码
        const code = ctx.helper.shortid.generate();
        
          // 保存到数据库
          shortUrl = await ShortUrlModel.create({ url, code });
      }
      
      return `${ctx.config.baseUrl}/${shortUrl.code}`;
    }
}

module.exports = ShortUrlService;

在 config/config.default.js 文件中添加配置项,指定基础 URL:

exports.config = {
  baseUrl: 'https://s.example.com',
};

最后,在 Controller 中调用 service 来实现 URL 缩短:

// app/controller/shorturl.js

const Controller = require('egg').Controller;

class ShorturlController extends Controller {
  
    async shorten() {
      const { ctx } = this;
      
        // 获取需要缩短的 URL 地址并进行缩短
        const url = ctx.request.body.url;
        const shortUrl = await ctx.service.shorturl.shortenUrl(url);
        
          // 返回缩短后的结果给客户端
          ctx.body = { short_url: shortUrl };
    }
}

module.exports = ShorturlController;

在这个示例代码中,我们首先使用了 egg-sequelize 插件来实现了与数据库的交互。在服务端实现了一个 shortenUrl 方法,接受一个字符串类型的 URL 地址作为参数,并返回其对应的缩短后的地址。

同时,我们使用了 shortid 库来实现短码的生成,并将其存储到数据库中。在 Controller 中调用该 service 方法,通过 HTTP 接口将 URL 地址发送给服务端进行缩短,并将结果返回给客户端。

需要注意的是,在使用该方法时应该保证 URL 的唯一性和重复性,并对生成的短码进行管理和保存。同时,在生成短码时可以根据需求调整字符集范围和长度等参数。

*
*
*