在开发微信公众号时,经常会遇到需要生成网页授权或认证地址的二维码场景。这类 URL 通常包含大量参数,甚至带有 #wechat_redirect 这样的片段,导致链接极长。虽然微信支持长按识别,但一旦将二维码缩小,图像极易模糊,普通相机扫码成功率大幅下降。
为提升识别率和用户体验,一个自然的思路是使用短链接服务压缩原始 URL。市面上虽有微博短链、第三方平台等选择,但它们往往存在明显缺陷:要么跳转前强制插入中间页,影响体验;要么因平台被滥用而整体受限,稳定性难以保障。
因此,更可靠的做法是自建一套轻量级短链接系统。其核心逻辑非常清晰:一是存储长链接与短码的映射关系,二是通过短码快速查出原链接并执行重定向。

本文以 Node.js + Express + MongoDB 为例,演示如何快速搭建这样一个服务。
首先初始化一个 Express 项目:
express -e demo
cd demo
npm install

接着安装所需依赖:
npm install mongoose shortid body-parser
其中:
- Mongoose 用于操作 MongoDB;
- ShortId 用于生成紧凑、可读性强的短码;
- Body-parser 解析 POST 请求体中的长链接数据。

接下来配置数据库连接(
dbconfig/db.js):module.exports = {
mongo_db: 'mongodb://localhost:27017/shorturl',
mongo_options: {
autoReconnect: true,
keepAlive: true,
reconnectTries: 50,
reconnectInterval: 1000,
connectTimeoutMS: 5000000
}
};
定义数据模型(
models/urltable.js),仅需记录短码与原始 URL:const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const urlSchema = new Schema({
shortUrl: String,
longUrl: String
});
module.exports = mongoose.model('UrlTable', urlSchema);
路由部分分为两块:生成短链和处理跳转。
在
/routes/url.js 中实现短链生成接口:const express = require("express");
const router = express.Router();
const shortId = require('shortid');
const UrlTable = require('../models/urltable');
const mongoose = require('mongoose');
const setup = require('../dbconfig/db');
// 自定义字符集,避免歧义字符(如 0/O, l/1 等)
shortId.characters('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
router.post('/', async (req, res) => {
const { longUrl } = req.body;
if (!longUrl) {
return res.status(400).send('Missing longUrl');
}
const shortCode = shortId.generate();
const record = { shortUrl: shortCode, longUrl };
<img src="/uploads/20251015/29.png?t=1999519340" alt="" class="img-fluid" />
try {
await mongoose.connect(setup.mongo_db, setup.mongo_options);
await UrlTable.create(record);
res.send(http://localhost:3000/${shortCode});
} catch (err) {
console.error(err);
res.status(500).send('Server error');
}
});
再添加重定向路由(可在主入口
app.js 中统一处理):app.get('/:shortCode', async (req, res) => {
const { shortCode } = req.params;
try {
await mongoose.connect(setup.mongo_db, setup.mongo_options);
const record = await UrlTable.findOne({ shortUrl: shortCode });
if (record) {
return res.redirect(record.longUrl);
}
res.status(404).send('Link not found');
} catch (err) {
console.error(err);
res.status(500).send('Server error');
}
});
至此,一个基础但完整的短链接服务已搭建完成。用户提交长链接后获得形如
http://localhost:3000/Ab3xK9 的短地址,该地址不仅二维码图案更简洁、易扫描,也便于分享传播。相比公共短链服务,自建方案完全可控,无中间页干扰,且可根据需求扩展功能——例如增加访问统计、设置有效期、限制域名白名单等。对于注重稳定性和安全性的开发者而言,这是更优的选择。
立即登录