短链接我们或多或少都使用过,所谓短链接就是根据较长的原链接url生成一段较短的链接,访问短链接可以跳转到对应的原链接,这样做好处在于:1. url更加美观;2. 便于保存和传播;3. 某些网站内容发布有字数限制,短链接可以节约字数。
短链接实现的原理非常简单,可以概括为:
根据以上思路,我们自己也可以分分钟实现一个短链接生成服务。本文示例使用 node + express + mongodb。
package.json:
"dependencies": {
"config": "^3.2.2", // 读取项目配置
"express": "^4.17.1", // web服务器
"mongoose": "^5.6.9", // 操作mongodb
"shortid": "^2.2.14", // 生成不重复的唯一Id
"valid-url": "^1.0.9" // 判断url格式是否正确
}
主要用于存放MongoDB的连接字符串和短链接的base url。
config/default.json:
{
"mongoURI": "mongodb://localhost:27017/url-shorten-service",
"baseUrl": "http://localhost:5000"
}
config/db.js:
const mongoose = require('mongoose');
const config = require('config');
const db = config.get('mongoURI');
const connectDB = async () => {
try {
await mongoose.connect(db, {
useNewUrlParser: true
});
console.log(`MongoDB Connected to: ${db}`);
} catch (error) {
console.error(error.message);
process.exit(1);
}
}
module.exports = connectDB;
index.js:
const express = require('express');
const connectDB = require('./config/db');
const app = express();
// 连接MongoDB
connectDB();
app.use(express.json({
extended: false
}));
// 路由,稍后设置
app.use('/', require('./routes/index'));
app.use('/api/url', require('./routes/url'));
const port = 5000;
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
我们需要将原链接和对应短链接保存到数据库,简单起见,我们只需要保存一个短链接编码,相应的短链接可以使用base url和编码拼接而成。
models/url.js:
const mongoose = require('mongoose');
const urlSchema = new mongoose.Schema({
urlCode: String,
longUrl: String
});
module.exports = mongoose.model('Url', urlSchema);
这是我们实现的关键一步,思路是:用户传入一个长链接,我们首先使用 valid-url 判断传入的url是否合法,不合法则返回错误,如果合法我们在数据库中搜索是否有该长链接的记录,如果有则直接返回该条记录,如果没有则生成一条新记录,并生成对应的短链接。借助于 shortId,我们可以很方便的生成一个不重复的唯一编码。
routes/url.js:
const epxress = require("express");
const router = epxress.Router();
const validUrl = require('valid-url');
const shortId = require('shortid');
const config = require('config');
const Url = require('../models/url');
router.post('/shorten', async (req, res, next) => {
const { longUrl } = req.body;
if (validUrl.isUri(longUrl)) {
try {
let url = await Url.findOne({ longUrl });
if (url) {
res.json({
shortUrl: `${config.get('baseUrl')}/${url.urlCode}`
});
} else {
const urlCode = shortId.generate();
url = new Url({
longUrl,
urlCode
});
await url.save();
res.json({
shortUrl: `${config.get('baseUrl')}/${urlCode}`
});
}
} catch (error) {
res.status(500).json('Server error');
}
} else {
res.status(401).json('Invalid long url');
}
});
module.exports = router;
最后一步非常简单,当用户访问我们生成的短链接时,我们根据url中的短链接编码查询到对应记录,如果存在对应记录我们使用express的res.redirect方法将访问重定向至原链接,如果不存在则返回错误。
routes/index.js
const epxress = require("express");
const router = epxress.Router();
const Url = require('../models/url');
router.get('/:code', async (req, res, next) => {
try {
const urlCode = req.params.code;
const url = await Url.findOne({ urlCode });
if (url) {
// 重定向至原链接
res.redirect(url.longUrl);
} else {
res.status(404).json("No url found");
}
} catch (error) {
res.status(500).json("Server error");
}
});
module.exports = router;
这样,一个简单的短链接生成服务就完成了,往往在我们看来很神奇的技术其实背后的原理和实现很简单,希望本文对大家有所启发。
本文Demo地址:https://github.com/MudOnTire/
链接可以使用任何css属性,包括字体、颜色、背景等等、链接有四个状态,可在四个状态时设置不同的属性,当为链接的不同状态设置样式时,需要遵循a:hover 必须位于a:link 和a:visited之后,a:active 必须位于 a:hover 之后
我们经常遇到,网页上点击一个链接或者qq图片,就开启了qq聊天窗口。那么如何通过a标签超链接打开qq对话框呢?下面介绍2种实现方式。
在我完成 electrade 的工作之余,还帮助一个朋友的团队完成了他们的项目。最近,我们希望为这个项目构建一个 Craiglist 风格的匿名电子邮件中继,其中包含 “serverless” Google Firebase Function
需求:通常站点,都会想让自己网站的视频和图片,免被盗用,毕竟视频流量,花的都是白花花银子(土豪可以不用考虑)~~。vaild_referers 有效的引用连接,如下,否则就进入$invaild_refere,返回403 forbiden。
背景:产品需求,input框输入图片链接,点击检测按钮的时候需要判断该图片不超过2M
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!