现在各大主流平台短网址服务都已经不对外开放了,下面介绍一个自己实现的方法,可以给自己使用。
先贴上项目链接: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.js
;nuxt.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~