Node短链服务搭建部署

794 阅读3分钟

背景

公司有很多H5活动都需要通过qrcode生成二维码,二维码会带一些用户和分享渠道等信息,最后通过html2canvas生成海报去做一些用户运营和拉新活动。但是比较长的链接通过qrcode去生成二维码,会遇到部分机型长按识别不了的情况,但是换成短的链接就可以。于是想到了短链服务,我把长的链接通过短链服务转成短链之后发现基本所有机型都可以识别二维码,也可以顺利跳转到对应链接。于是就自己找资料搭了一个短链服务,整理资料供大家参考。

初始化项目

1、安装依赖

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格式是否正确
}

2、增加项目配置

config/default.json: 主要用于存放MongoDB的连接字符串和短链接的baseUrl

{
  "mongoURI": "mongodb://username:password@hostname:27017/url-shorten-service?authSource=admin",
  "baseUrl": ""
}

username:password Mongodb用户名:密码

baseUrl: 服务器ip+端口或者域名

3、增加MongoDB连接方法

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;

4、启动express

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}`);
});

5、定义数据库模型

我们需要将原链接和对应短链接保存到数据库,简单起见,我们只需要保存一个短链接编码,相应的短链接可以使用base url和编码拼接而成

models/url.js:

const mongoose = require('mongoose');

const urlSchema = new mongoose.Schema({
  urlCode: String,
  longUrl: String
});

module.exports = mongoose.model('Url', urlSchema);

6、生成短链接编码

这是我们实现的关键一步,思路是:用户传入一个长链接,我们首先使用 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;

7、访问短链接跳转到原链接

最后一步非常简单,当用户访问我们生成的短链接时,我们根据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;

安装MongoDB

1、创建一个/etc/yum.repos.d/mongodb-org-4.4.repo文件,以便您可以使用yum以下命令直接安装MongoDB

[mongodb-org-4.4]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc

2、安装最新的稳定版MongoDB

sudo yum install -y mongodb-org

3、修改配置文件 /etc/mongod.conf

bindIp=0.0.0.0  #默认是127.0.0.1,开启远程访问

4、启动MongoDB

启动mongodb :systemctl start mongod.service

停止mongodb :systemctl stop mongod.service

查到mongodb的状态:systemctl status mongod.service

重启mongodb:systemctl restart mongod.service

5、配置账号密码

进入admin数据库
use admin

创建root用户
db.createUser({user:"root",pwd:"password",roles:["root"],mechanisms : ["SCRAM-SHA-1"]})

6、安装MongoDB for VS Code连接查看数据

image.png

PM2启动Node服务

pm2 start index.js --name url-shorten-service

启动成功效果

Postman测试接口

image.png