一起养成写作习惯!这是我参与「掘金日新计划 · 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脚本
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
复制代码
- 使用Postman测试/create 请求
加上content-type
使用最常用的json传递数据
环境搭建ok
四、引入腾讯云服务SDK
4.1 在腾讯云平台搜索cloudBase
4.2 创建后端服务(也可以选空白模板创建)
4.3 按量计费
如果弹出升级数据库4.5元可以直接返回,不用升级的
4.4 进入数据库,创建一个links的数据库
- 这个界面有数据库使用的文档,点击进去,找node相关的即可
4.4 第一次调用去申请生成下secretid和secretkey
cloud.tencent.com/document/pr…
4.5 新建.env记录id和key
哈哈,我这个等会儿会禁用掉~
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
复制代码
- 测试
- 引入腾讯云开发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}`})
})
复制代码
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