node.js中的链接缩短器

194 阅读5分钟

node.js中的URL缩短器

发布者::Yatin Batra inJavaScript May 10th, 2022 0 Views

你好。在本教程中,我们将看看如何在mongodb的帮助下在nodejs应用程序中实现url shortener。我将使用mlab门户来创建和管理mongodb。

1.1.简介

这些天来,人们不喜欢记住大的长的网址来导航到他们喜欢的网站,所以记住短的网址是一种趋势。网址缩短的另一个好处是,它有助于将流量带回你的网站。

1.1 设置Node.js

要在Windows上设置Node.js,你需要从这个链接下载安装程序。点击你的平台的安装程序(也包括NPM包管理器),运行安装程序,开始Node.js设置向导。按照向导的步骤操作,完成后点击 "完成"。如果一切顺利,你可以导航到命令提示符来验证安装是否成功,如图1所示。

图1: 验证node和npm的安装

2.nodejs中的URL缩短器

为了设置应用程序,我们需要导航到我们的项目所在的路径,我将使用Visual Studio Code作为我的首选IDE。让我们快速浏览一下项目结构。

Fig. 2: 项目结构

2.1 设置依赖性

导航到项目目录,运行npm init -y ,创建一个package.json 文件。这个文件持有与项目相关的元数据,用于管理项目的依赖关系、脚本、版本等。用下面给出的代码替换生成的文件----。

package.json

{
  "name": "urlshortner",
  "version": "1.0.0",
  "description": "url shorten in nodejs application",
  "main": "index.js",
  "scripts": {
    "dev": "nodemon index.js",
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "url shorten",
    "nodejs",
    "express",
    "nodemon",
    "url"
  ],
  "author": "geek",
  "license": "MIT",
  "dependencies": {
    "config": "^3.3.7",
    "express": "^4.18.0",
    "mongoose": "^6.3.1",
    "shortid": "^2.2.16",
    "valid-url": "^1.0.9"
  },
  "devDependencies": {
    "nodemon": "^2.0.15"
  }
}

一旦该文件被替换,在终端窗口触发下面的npm 命令,下载本教程所需的不同软件包。

下载依赖项

npm install

2.2 设置配置json

config 文件夹中创建一个json文件,负责保存应用程序的配置相关细节。你可以根据你的要求自由地改变这些值。请注意,端口号应与基本网址中指定的端口号同步。

config/default.json

{
  "mongodbUrl": "MONGODB_ENDPOINT",
  "port": 3005,
  "baseUrl": "http://localhost:3005"
}

2.3 设置数据库配置

config 文件夹中创建一个js文件,负责在mongoose npm软件包的帮助下与mongodb建立连接。如果与mongodb的连接无法建立,应用程序将崩溃并以-1的状态码退出。

config/db.js

const mongoose = require("mongoose");
const config = require("config");

const db = config.get("mongodbUrl");

const connectDb = async () => {
  try {
    await mongoose.connect(db, {
      useNewUrlParser: true
    });

    console.log("Mongodb connected...");
  } catch (err) {
    console.error("Cannot cannot be mongodb. Existing application startup.");
    console.error(err.message);
    process.exit(-1);
  }
};

module.exports = connectDb;

2.4 创建一个模型

models 文件夹中创建一个js文件,负责在数据库连接建立后在mongodb中制作模式。

models/Url.js

const mongoose = require("mongoose");

const urlSchema = new mongoose.Schema({
  urlCode: String,
  longUrl: String,
  shortUrl: String,
  date: { type: String, default: Date.now }
});

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

2.5 创建路由

routes 文件夹中创建一个js文件,负责处理应用程序的端点。该文件由三个端点组成,即

  • /health:返回应用程序的健康状况
  • /shorten:负责为请求体中的长URL生成短URL,并将其持久化在mongodb中。该端点还执行了一些基本的理智操作
  • /:code:负责验证请求中的短网址,并在发现时将用户重定向到长网址。

routes/url.js

const express = require("express");
const validUrl = require("valid-url");
const shortId = require("shortid");
const config = require("config");
const Url = require("../models/Url");

const router = express.Router();

// @route   GET /health
// @desc    Get application health
router.get("/health", (req, res) => {
  return res.status(200).json({ message: "Application is healthy" });
});

// @route   POST /shorten
// @desc    Create short URL
router.post("/shorten", async (req, res) => {
  const { longUrl } = req.body;
  const baseUrl = config.get("baseUrl");

  // check base url
  if (!validUrl.isUri(baseUrl)) {
    return res.status(400).json({ message: "Invalid base url" });
  }

  // check long url
  if (validUrl.isUri(longUrl)) {
    try {
      let url = await Url.findOne({ longUrl });
      if (url) {
        console.log("Already exists...");
        return res.status(201).json({ data: url });
      } else {
        // create url code
        let urlCode = shortId.generate();
        let shortUrl = baseUrl + "/" + urlCode;

        url = new Url({
          longUrl,
          shortUrl,
          urlCode,
          date: new Date()
        });

        console.log("Saving new record...");
        await url.save();
        return res.status(201).json({ data: url });
      }
    } catch (error) {
      console.error(error);
      return res.status(500).json({ message: "Some error has occurred" });
    }
  } else {
    return res.status(400).json({ message: "Invalid long url" });
  }
});

// @route     GET /:code
// @desc      Redirect to long/original URL
router.get("/:code", async (req, res) => {
  try {
    const url = await Url.findOne({ urlCode: req.params.code });

    if (url) {
      console.log("Long url found for short url. Redirecting...");
      return res.redirect(url.longUrl);
    } else {
      return res.status(404).json({ message: "No url found" });
    }
  } catch (error) {
    console.error(error);
    return res.status(500).json({ message: "Some error has occurred" });
  }
});

module.exports = router;

2.6 设置实现

在根目录下创建一个文件,负责处理应用程序的启动,连接到mongodb,并维护路由。这个文件作为一个入口点,将在端口号--3005上启动。

index.js

const express = require("express");
const connectDb = require("./config/db");
const config = require("config");

const app = express();

// connect to database
connectDb();

app.use(express.json({ extended: false }));

// define routes
app.use("/", require("./routes/url"));

// driver code
const port = config.get("port");
app.listen(port, () => {
  console.log(`Service endpoint http://localhost:${port}`);
});

3.运行应用程序

要运行应用程序,请导航到项目目录,并在终端输入以下命令,如下所示。

运行命令

$ npm run dev

如果一切顺利,应用程序将在服务端点成功启动。http://localhost:3005

4.演示

打开postman或你选择的任何工具,用如下所示的请求体点击/shorten 端点。

请求

(http post) - http://localhost:3005/shorten

request body -
{
    "longUrl": "ANY_LONG_ENDPOINT"
}

如果一切顺利,相应的短网址将被生成并持久化在mongodb中。api也将返回一个响应,如下所示。

api响应

{
    "urlCode": "Nd7drt9Ru",
    "longUrl": "ANY_LONG_ENDPOINT",
    "shortUrl": "http://localhost:3005/Nd7drt9Ru",
    "date": "Wed Apr 27 2022 13:58:46 GMT+0530 (India Standard Time)",
    "_id": "6268febef324c7ae588e1497",
    "__v": 0
}

然后你可以复制shortUrl ,并在浏览器中点击,应用程序将把你重定向到原来的长网址。这就是本教程的全部内容,我希望这篇文章能为你提供你想要的东西。祝你学习愉快,不要忘记分享!

5.总结

在本教程中,我们看到了在nodejs的帮助下实现url的缩短,并将结果持久化在mongodb中。你可以从下载区下载源代码。

6.下载项目

这是一个在nodejs中实现url缩短的教程。

下载
你可以在这里下载这个例子的完整源代码。 nodejs中的url缩短器

JavaScript MongoDB Mongoose nodejs 2022-05-10

+Yatin Batra