Nodejs 实现短网址功能

现在各大主流平台短网址服务都已经不对外开放了,下面介绍一个自己实现的方法,可以给自己使用。

先贴上项目链接:https://t.dst.mba

一、准备环境

  • Nodejs
  • Sequelize
  • Vue
  • Nuxt

二、项目搭建

前端 + 服务端这边直接使用了nuxt,官网:https://nuxtjs.org

# 初始化项目
npm init nuxt-app <project-name>

这边前端页面逻辑比较简单,就是提交网址做一个校验然后传给服务端,这里就不赘述了。

首先根目录创建util,创建以下文件

// 用于生成短链接的随机id
const shortId = require('shortid');

module.exports = (sequelize, DataTypes) => {
    const ShortUrlModel = sequelize.define('ShortUrlModel', {
      full: {
        type: DataTypes.STRING
      },
      short: {
        type: DataTypes.STRING,
        defaultValue: shortId.generate
      },
    })
  
    ShortUrlModel.associate = function (models) {
    }
  
    return ShortUrlModel
  }
// config.js
const path = require('path');

module.exports = {
    db: {
        database: process.env.DB_NAME || 'shorturl',
        user: process.env.DB_USER || 'shorturl',
        password: process.env.DB_PASS || 'shorturl',
        options: {
          dialect: process.env.DIALECT || 'sqlite',
          host: process.env.HOST || 'localhost',
          storage: path.resolve(__dirname, './shorturl.sqlite')
        }
      }
}
// db.js
const {Sequelize} = require('sequelize');
const config = require('./config.js');
const fs = require('fs');
const path = require('path');
const db = {};

const sequelize = new Sequelize(
    config.db.database,
    config.db.user,
    config.db.password,
    config.db.options
);

fs
  .readdirSync(__dirname)
  .filter((file) =>
    file !== 'index.js'
  )
  .forEach((file) => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes)
    db[model.name] = model
  })

Object.keys(db).forEach(function (modelName) {
    console.log(Object.keys(db))
  if ('associate' in db[modelName]) {
    db[modelName].associate(db)
  }
})

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

根目录新建server-middleware文件夹,新增一个middleware.jsnuxt.config.js同理增加

// middleware.js
const express = require('express');
const app = express();

const {sequelize, ShortUrlModel} = require('../util/db');

// sequelize连接数据库
sequelize.sync({force: true})
  .then(() => {
    console.log(`Data base created`)
})

app.use(express.urlencoded({ extended: false }));

app.post('/shortUrls', async (req, res) => {
    // 提交链接数据,并保存
    await ShortUrlModel.create(req.body);
    res.redirect('/');
})

app.get('/:short', async (req, res) => {
    // 根据短链接码找到这条数据,数据里头有完整链接
    const shortUrl = await ShortUrlModel.findOne({
        where: {
            short: req.params.short
        }
    });
    // 得到完整链接后,进行重定向
    res.redirect(shortUrl.full)
})
  
module.exports = app
// nuxt.config.js
serverMiddleware: [
    { path: "/", handler: "~/server-middleware/middleware.js" }
  ]

代表所有localhost:3000/都会转发到index.js,这个中间间里面;

接下来前端正常实现页面调用/shortUrls缩短链接,/:short短链接跳转到长链接了~

enjoy~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

unstorm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值