Node + Express + 腾讯云数据库开发短网址服务

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

一、什么是腾讯云服务

更关注业务本身,而不是服务器、环境这些。开发人员只需要写代码,写完代码后往云服务器上推,就可以自动更新。

1.1 Serveless倡导的理念

  • 函数即服务, Function as a Service, Fass;
  • 后端即服务, Backend as a Serveice, Bass;

1.2 腾讯云服务的优势

  • 不需要考虑什么物理机/虚拟机, 结合工作流的情况下, 代码提交自动部署,直接运行;
  • 没有服务器,维护成本子让大大降低,安全性稳定性更高;
  • 都是弹性伸缩云,不用担心性能问题;
  • 大多数Serverless服务商的计价方式都是按使用情况(如流量、CPU占用)来收费;

二、短网址服务功能简介

平常访问一个网址,后面可能携带一堆参数,这样的连接会过长,短网址则很好的解决了这个问题

2.1 用户可以为指定URL创建对应短链

  • 允许用户通过参数指定生成的短链slug
  • 如果没有指定短链,默认使用自动生成的短字符ID

2.2 用户访问短链,自动跳转到相应URL

  • 如果短链不存在,则返回404
  • 如果短链存在,记录访问日志(ip, ua, timestamp)

三、 搭建Node + Express环境

3.1 项目初始化

npm init -y
复制代码

3.2 安装express

npm i express
复制代码

3.3 安装node-dev 热更新代码

npm i node-dev -D
复制代码

3.4 编写dev脚本

截屏2022-04-09 下午4.19.01.png

3.5 编写app.js 程序

const express = require('express')

const app = express()
// 解析json格式, x-www-form-urlencoded格式中间件
app.use(express.json())
app.use(express.urlencoded())

app.post('/create', (req, res) => { 
  console.log(req.body);
  const { url, slug} = req.body
  res.send({url,slug,date: Date.now()})
})


module.exports = app
复制代码

3.6 编写启动node服务程序

const app = require('./app')

app.listen(3080, () => { 
  console.log('server is ready > http://localhost:3080');
})

复制代码

3.7 测试Node + Express环境

npm run dev
复制代码

image.png

  • 使用Postman测试/create 请求

加上content-type

image.png

使用最常用的json传递数据

image.png 环境搭建ok

四、引入腾讯云服务SDK

4.1 在腾讯云平台搜索cloudBase

截屏2022-04-09 下午4.27.32.png

4.2 创建后端服务(也可以选空白模板创建)

截屏2022-04-09 下午4.28.33.png

4.3 按量计费

截屏2022-04-09 下午4.29.09.png

如果弹出升级数据库4.5元可以直接返回,不用升级的

4.4 进入数据库,创建一个links的数据库

  • 这个界面有数据库使用的文档,点击进去,找node相关的即可

image.png

4.4 第一次调用去申请生成下secretid和secretkey

cloud.tencent.com/document/pr… 未命名.png

image.png

4.5 新建.env记录id和key

哈哈,我这个等会儿会禁用掉~

image.png

4.6 安装dotenv,以便在开发环境能够读到.env中的数据

npm i dotenv -D
复制代码

4.7 编写启动脚本

package.json中 -r 先读取.env 在执行index.js入口文件

"dev": "node-dev -r dotenv/config index.js"
复制代码

4.8 编写插入腾讯云数据库的代码

const express = require('express')
const { init } = require('@cloudbase/node-sdk')
const { SECRET_ID, SECRET_KEY } = process.env

const tcb = init({ env: 'hello-cloudbase-8gvwwq9l939dc1c2', secretId: SECRET_ID, secretKey: SECRET_KEY })

const db = tcb.database()


const app = express()
// 解析json格式, x-www-form-urlencoded格式中间件
app.use(express.json())
app.use(express.urlencoded())

app.post('/create', async(req, res) => { 
  console.log(req.body);
  const { url, slug } = req.body
  await db.collection('links').add({slug,url})
  res.send({link: `http://lcoalhost:3080/${slug}`})
})


module.exports = app
复制代码
  • 测试

image.png

image.png

- 引入腾讯云开发SDK成功   
复制代码

4.9 引入nanoid

-  npm i nanoid
复制代码

五、测试第一个短码链接

5.1 create寸短码和长码链接

const { nanoid} = require('nanoid')
// 存长短码对应的链接
app.post('/create', async(req, res) => { 
  console.log(req.body);
  // 没有传短码自动生成个6位的id做短码
  const { url, slug=nanoid(6) } = req.body
  await db.collection('links').add({slug,url})
  res.send({link: `http://lcoalhost:3080/${slug}`})
})
复制代码

image.png

5.2 /:slug动态路由参数取长码链接

// 根据短码找到长码,并重定向
app.get('/:slug', async (req, res) => {
  console.log(req.params);
  const { slug } = req.params
  const { data } = await db.collection('links').where({ slug }).get()
  const [link] = data
  res.redirect(link.url)
})
复制代码

ok

屏幕录制2022-04-09-下午9.34.58.gif

猜你喜欢

转载自juejin.im/post/7085352543324209165
今日推荐