把冗长交给风,把简洁留给光。
当微信二维码因地址过长而像一团墨渍,我们决定亲手造一把「裁云剪」。于是,「快缩短网址」诞生在域名 suo.run 之上——轻若晨露,却可盛下万里长链。
一、缘起
公众号的网页授权地址动辄数百字符,二维码一旦缩小,即刻化作模糊棋盘。公共短链平台虽多,却常夹带跳转广告,甚至因灰色内容整体封禁。与其寄人篱下,不如自立门户。
二、极简架构
只需两步,便能让长链瘦身:
1. 存:长链与短码一一映射;
2. 取:收到短码,即刻 301 直跳。
Node.js 与 MongoDB 的联袂,让这两步快得只剩风声。
三、动手
1. 起炉
express -e suo && cd suo
npm i mongoose shortid body-parser
2. 接库
// db.js
module.exports = {
url: 'mongodb://localhost:27017/suo',
opts: {
autoReconnect: true,
keepAlive: true,
reconnectTries: 50,
reconnectInterval: 1000,
connectTimeoutMS: 5000
}
};

3. 建模
// models/url.js
const { Schema, model } = require('mongoose');
module.exports = model('Url', new Schema({
short: String,
long: String,
clicks: { type: Number, default: 0 }
}));
4. 路由
// routes/index.js
const express = require('express');
const shortId = require('shortid');
const router = express.Router();
const Url = require('../models/url');
shortId.characters('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');

router.post('/shorten', async (req, res) => {
const { long } = req.body;
const key = shortId.generate();
await Url.create({ short: key, long });
res.json({ short: https://suo.run/${key} });
});
router.get('/:key', async (req, res) => {
const doc = await Url.findOneAndUpdate({ short: req.params.key }, { $inc: { clicks: 1 } });
if (doc) return res.redirect(301, doc.long);
res.status(404).send('Not Found');
});
module.exports = router;
5. 启动
npm start
浏览器打开 https://suo.run,一条长链眨眼化作六字符短码,二维码瞬间清爽如新雪。
四、尾声
从此,再长的故事也能被折叠成一句暗号,再小的二维码也能被相机一眼认出。
把链接交给 suo.run,把简洁留给自己。