实现一个 Code Pen:(五)白嫖云数据库

sxkk20082年前知识分享166

前言

前面的文章中,我们配置好了编辑器,实现了 css、html、js 的编辑,并且可以在浏览器端编译代码,接下来我们需要实现数据存储的功能。再次提一下我的技术栈主要是 Next.js。我们知道使用 Next.js vercel 就可以帮我们自动部署,vercel 提供了网站托管和 serverless(函数即服务)的能力, 但是 vercel 没有提供数据库存储的能力,那么我需要买数据库吗?

使用 Uniapp 的目的

很多人可能使用过 uniapp,来开发小程序,使用的是 Vue 技术栈,并且写一套代码就可以打包成多端和跨端的应用,可以极大的加快开发速度,如果选择使用阿里云,可以有 50 个免费项目,简直就是白嫖,在这里我只使用云函数和云数据库。

云函数开发

首先需要下载 HbuildX ,然后注册登录,新建项目,这些我就不展开讲了,大家可以自行查官方教程。

uniCloud web 控制台

并且关联好云服务空间,一个项目中可以有 50 个云函数,由于我之前的项目没几个云函数,所以我这里关联的是另外一个项目 mdx-editor

选择 uniCloud 目录右键,可以打开 uniCloud web 控制台。

创建空表

点击云数据库,创建空表,命名成 pen

新建云函数

选择 clouldfunctions 右键选择新建云函数。

输入云函数代码

'use strict'
const db = uniCloud.database()

exports.main = async (event, context) => {
  if (event.httpMethod === 'GET') {
    const id = event.queryStringParameters.id
    const res = await db.collection('pen').doc(id).get()
    if (res) {
      return res.data[0]
    }
  }
  const data = JSON.parse(event.body)

  const timeStamp = new Date().getTime()
  let result = await db.collection('pen').add({
    ...data,
    createTime: timeStamp,
  })

  if (result.id) {
    return {
      ok: true,
      id: result.id,
    }
  }
  return {
    ok: false,
    msg: '异常错误',
  }
}

在这段代码中我将查询和添加的逻辑都写在一个云函数中,如果请求是 get,那就是查询,否则就是添加。

上传部署

保存代码后选择上传部署,至此云函数开发完成,那么要如何在我们的项目中对接呢?

云函数 URL 化

云函数列表

打开 uniCloud web 控制台,点击上传云函数右侧的详情按钮

云函数 URL 化

在最下面云函数 URL 化,填写 PATH,保存成功后,复制整个 URL, 有了这个 URL 后就可以在我们 web 应用中访问了。但如果是直接用浏览器访问这个 URL,浏览器会下载一个 JSON,是不可用的。

保存数据

我们使用 post 接口保存数据。

const [state, handleSave] = useAsyncFn(async () => {
  const response = await window.fetch(process.env.NEXT_PUBLIC_API_URL + '/api/pen', {
    method: 'POST',
    headers: {
      'content-type': 'application/json',
    },
    body: JSON.stringify(data),
  })
  const result = await response.json()

  Router.push(`/pen/${result.id}`)
  return result
}, [data])

在上面代码中,将云函数的域名设置到环境变量中,方便以后迁移和部署。我们使用 react-use 中的 useAsyncFn, 这个 hook 将请求状态和返回结果保存在 state 中,点击保存按钮,执行 handleSave 就可以提交数据。

code editor 保存数据

以下几个字段是我们要保存的数据,这些数据从 state 中取就可以了。

handleSave({
  html: '...',
  css: '...',
  js: '...',
  scripts: [],
  styles: [],
  cssLang: 'css',
  jsLang: 'babel',
  htmlLang: 'html',
  name: '玻璃拟态',
})

没配置跨域,403 错误

当我点击保存的时候,浏览器会报 403 错误,原因是我们请求跨域了,所以我们需要在 uniCloud web 控制台添加运行跨域的域名。 跨域配置

再次点半保存,数据保存成功。

保存成功后,经返回的 id 传到 url 上,跳转到/pen/${id},查看详情页面。

查询数据

我们可以使用同样的方法查询数据。为了体现 next.js 服务端优势,对 SEO 更友好,我们可以在 getServerSideProps 中获取数据。

export async function getServerSideProps({ params, res, query }) {
  if (params.id && params.id[0] === 'create') {
    res.setHeader('cache-control', 'public, max-age=0, must-revalidate, s-maxage=31536000')
    return {
      props: {},
    }
  } else {
    try {
      const initialContent = await get({
        id: params.id[0],
      })

      res.setHeader('cache-control', 'public, max-age=0, must-revalidate, s-maxage=31536000')

      return {
        props: {
          id: params.id[0],
          initialContent,
        },
      }
    } catch (error) {
      return {
        props: {
          errorCode: error.status || 500,
        },
      }
    }
  }
}

上面代码中,如果 id 等于create 的时候就不需要查询数据。

下面代码是服务端请求数据的代码

import fetch from 'node-fetch'

export function get({ id }) {
  return fetch(process.env.NEXT_PUBLIC_API_URL + '/api/pen?id=' + id, {
    headers: {
      Accept: 'application/json',
    },
  }).then((response) => {
    return response.json()
  })
}

由于 vercel 的 nodejs 版本是 14,所以数据请求,还不支持 fetch,我们还需要安装 node-fetch

小结

预览地址:https://code.runjs.cool/pen/create

代码仓库:https://github.com/maqi1520/next-code-pen

本篇主要介绍如何使用 uniapp 中的云函数和云数据库,并且通过云函数 URL 化,来给外部应用访问,其中保存数据和请求数据部分是常规代码,熟悉 next.js 和 react 的同学都没问题,相对比较简单。

以上就是本文全部内容,希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。

本文首发掘金平台,来源Ai知识分享博客

相关文章

AI合成人脸技术的发展与隐忧

AI合成人脸技术的发展与隐忧

  随着人工智能技术的飞速发展,AI合成人脸技术在各个领域的应用逐渐得到普及。这项技术利用深度学习算法和大数据分析能力,可以生成逼真的人脸图像和视频。虽然AI合成...

2-3 分钟后会在屏幕上输出宝塔面板的登录地址,宝塔面板会随机生成用户名、密码和端口,我们需要把这些地址保存到本地,以免下次忘记。

接下来我们需要在云服务器上设置安全组或者防火墙,放行自动生成的端口。

腾讯云配置安全组

开通了端口,输入宝塔面板地址,输入用户名和密码就可以登录了 宝塔面板登录

域名解析

腾讯云域名解析

在你的域名服务商后台,将一个域名解析到 这台这台服务器 ip,解析完成后,你就可以使用域名访问了。

安装 PHP+mysql

登录后要先绑定一个宝塔账号,这个大家自行注册就可以了 选择系统推荐的 LNMP 环境 绑定成功后,我们来安装 PHP+mysql,系统会自动弹窗框让我们来选择环境,我这里选择 LNMP

  • 急速安装,安装时间极快(5-10 分钟),版本与稳定性略低于编译安装,适合快速部署测试
  • 编译安装,安装时间长(30 分钟到 2 小时),性能最大化,适合生产环境, 点击一键安装后,宝塔面板就会开始安装环境了

LNMP 环境安装进度 等待 10 分钟后,环境安装完成,当然有经验的同学可以自行安装 PHP+mysql 的环境,但是使用宝塔面板对新手比较友好。

访问IP显示会宝塔404页面 此时访问我们的 IP 就可以看到页面,说明我们的环境已经安装成功了。

安装微擎

微擎官网:https://www.we7.cc/

微擎官方文档:https://www.kancloud.cn/donknap/we7/136557

微擎源码地址:https://gitee.com/we7coreteam/pros

微擎是一款小程序和公众号管理系统,可以实现微信平台(mp.weixin.qq.com)不能实现的功能,例如商城,餐饮,酒店,汽车,门店,同城,各类行业解决方案,营销,推广,吸粉,游戏,物联网和人工智能等功能,这些应用大部分收费,也有免费的应用,大家可以在官网上搜索安装。

点击网站,添加网站,输入你自己的要解析的域名, 宝塔面板添加网站

选择创建数据库,和 FTP,点击提交,此时输入我们的域名可以看到如下页面

宝塔默认创建的页面

说明我们的网站创建成功了。

安装微擎框架

在网站 ftp 目录下上传微擎框架的源码 上传微擎框架源码

上传完成后点击 zip 文件解压

设置网站默认站点

点击默认站点,设置我们刚才创建的网站

输入IP,开始安装微擎 输入 IP 地址,就可以进入微擎的安装页面了。 微擎安装页面检查环境

安装过程中会检查 PHP 环境要求,若检查不成功,我们需要修改相应的 PHP info 文件。

微擎配置数据库和密码

点击继续输入刚才创建的数据库信息,并且设置微擎后台密码

微擎安装完成

点击继续安装完成

《成语小秀才》部署教程

前言相信很多朋友都玩过这款小游戏,叫成语秀才,没体验过的朋友可以点击这里,扫码体验,这款小游戏开发起来还是比较困难的,首先要有一份海量的题库,然后在每道题都有不同的布局,我是一个非常喜欢学习的人,于是...

人工智能课程:个人与社会发展的关键

人工智能课程:个人与社会发展的关键

  在当今数字化时代,人工智能作为一项颠覆性技术,正迅速改变着我们的生活和工作方式。为了适应这一新时代的发展,人工智能课程已成为学校和职业培训机构必备的课程之一。该课程不仅为...

实现一个 Code Pen:(一)项目初始化

前言前段时间掘金上线了一个新功能 Code pen,可以在线写代码,浏览器就可以运行预览,在文章中就可以插入代码片段,对 web 开发者大有裨益,非常方便读者对文章的理解,笔者对这种在线实时编辑的功能...

智能管家:革新生活品质的智慧助手

智能管家:革新生活品质的智慧助手

  现如今,科技的不断进步带来了许多改变,其中智能管家作为人工智能技术的重要应用之一,正逐渐渗透到人们的生活中。智能管家不仅使生活更加方便和舒适,还提供了更多的可能性与安全保...

科技与智能的结合碰撞出不一样的火花

科技与智能的结合碰撞出不一样的火花

   随着科技的不断进步和智能化的趋势不断加剧,人类也在不断探索和研究各种新技术,其中AI技术是最受注目的一种。AI技术指的是人工智能技术,也就是让机器像人一样具备学习、推理...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。