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

