返回介绍

五、综合实战

发布于 2024-01-31 23:58:26 字数 13329 浏览 0 评论 0 收藏 0

5.1 Serverless 中使用 Node 操作 Mysql、Mongodb 数据库、以及配置 VPC 私有网络

云函数接入数据库

参考: https://cloud.tencent.com/document/product/583/51935

注意:配置私有网络的服务器需要在同一个地区

Nodejs Serverless 中操作 Mysql

  • 准备工作:首先需要购买云数据库、或者自己在服务器上面搭建一个数据库
  • 云函数操作 Mysql

购买云数据库 mysql

新建 mysql 云函数

  • 选择和 mysql 同一个地域,程序之间通过 VPC 网络连接

  • 选择私有网络,和 mysql 所在网络一致

如果没有需要新建私有网络,需要和 msyql 实例同一个地区,选择了新建的私有网络,mysql 实例那边网络需要修改一致

  • 登录 mysql 数据库增加测试数据

新建 test 数据库

创建 user 表

  • 修改云函数代码,保存部署即可

/**************************************************
Node8.9-Mysql
Reference: mysql api---https://www.npmjs.com/package/mysql
Reference: How to access database---https://cloud.tencent.com/document/product/236/3130
Reference: How to connect api gateway with scf---https://cloud.tencent.com/document/product/628/11983
***************************************************/

function wrapPromise(connection, sql) {
  return new Promise((res, rej) => {
    connection.query(sql, function(error, results, fields) {
      if (error) {
        rej(error)
      }
      res(results)
    })
  })
}


exports.main_handler = async (event, context, callback) => {
  const mysql = require('mysql');
  const connection = mysql.createConnection({
    host: '167.16.0.17', // The ip address of cloud database instance, 云数据库实例 ip 地址
    user: 'root', // The name of cloud database, for example, root, 云数据库用户名,如 root
    password: 'xx', // Password of cloud database, 云数据库密码
    database: 'test', // Name of the cloud database, 数据库名称
    port: "3306"
  });

  connection.connect();

  const querySql = `SELECT * from user`

  let queryResult = await wrapPromise(connection, querySql)
  
  connection.end();

  return queryResult
}

重新部署

  • 创建 API 网关触发器,在浏览器中访问

浏览器中访问查看效果

Nodejs Serverless 中操作 Mongodb

  • 准备工作:首先需要购买云数据库、或者自己在服务器上面搭建一个数据库
  • 云函数操作 Mongodb

购买 MongoDB 数据库

创建云函数

  • 选择地区

  • 选择私有网络,和 mongodb 所在网络一致

  • 修改云函数代码
const {promisify} = require('util')
const mongodb = require('mongodb')

var mongoClient = mongodb.MongoClient,
    assert = require('assert');

const connect = promisify(mongodb.connect)

// URL combination
// var url = 'mongodb://mason_mongodb:mason12345@10.10.11.19:27017/admin';

var url="mongodb://mongouser:password@10.0.0.13:27017,10.0.0.8:27017,10.0.0.11:27017/admin?authSource=admin&replicaSet=cmgo-e23piswf_0"

exports.main_handler = async (event, context, callback) => {
    console.log('start main handler')
    const MongoClient = require("mongodb").MongoClient;
    const mc = await MongoClient.connect(url,{useNewUrlParser: true})
    const db = mc.db('testdb') 
    const collection = db.collection('demoCol')
    await collection.insertOne({a:1,something:'你好 serverless'})
    const as = await collection.find().toArray()
    console.log(as)

    mc.close()

    return as
}

创建触发器

5.2 Serverless BaaS 对象云存储 Cos 介绍、Node 操作 Cos、实现图片上传到 Cos 中

对象云存储 Cos 介绍

狭义的 Serverless 是指现阶段主流的技术实现:狭义的 Serverless 是 FaaSBaaS 组成

对象存储(Cloud Object Storage,COS)是一种存储海量文件的分布式存储服务,具有高扩 展性、低成本、可靠安全等优点。通过控制台、API、SDK 和工具等多样化方式,用户可简 单、快速地接入 COS,进行多格式文件的上传、下载和管理,实现海量数据存储和管理。

Nodejs 操作 Cos

参考官方文档: https://cloud.tencent.com/document/product/436/8629

cnpm i cos-nodejs-sdk-v5 --save
const COS = require('cos-nodejs-sdk-v5');
const fs=require("fs");

//配置 cos 的 sdk  https://console.cloud.tencent.com/cam/capi
var cos = new COS({
    SecretId: 'xx',
    SecretKey: 'xx'
});

//上传本地图片到对象云存储里面
cos.putObject({
    Bucket: 'express-demo-1251179943', /* 必须存储桶名称 */
    Region: 'ap-guangzhou',    /* 必须 区域*/
    Key: 'a.png',              /* 必须   目录/文件的名称  */
    StorageClass: 'STANDARD',
    Body: fs.createReadStream('./a.png'), // 上传文件对象
    onProgress: function(progressData) {
      console.log(JSON.stringify(progressData));
    }
}, function(err, data) {
    console.log(err || data);
});

Express 在 Serverless 中实现图片上传到 Cos 中

安装模块 multer https://github.com/expressjs/multer

npm install --save multer

配置 form 表单

<!-- views/index.html -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Serverless Component - Express.js</title>
    <link rel="stylesheet" href="/css/basic.css">
  </head>
  <body>
    <form action="/doUpload" method="post" enctype="multipart/form-data">
      用户名:<input type="text" name="username" />
      <br>
      <br>
      头 像 : <input type="file" name="face" />
      <br>
      <br>
      <input type="submit" value="提交">
    </form>
  </body>
</html>

配置内存存储引擎 ( MemoryStorage ),内存存储引擎将文件存储在内存中的 Buffer 对象,它没有任何选项

var storage = multer.memoryStorage()
var upload = multer({ storage: storage })

接收文件上传文件到云存储

// app.js
const express = require('express');
const path = require('path');
const ejs = require("ejs");
var bodyParser = require('body-parser')
var multer = require('multer');
var tools = require('./services/tools.js');

const app = express();

//配置上传
var storage = multer.memoryStorage();
var upload = multer({ storage: storage });

// 配置中间件
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json())

//配置模板引擎
app.engine("html", ejs.__express)
app.set("view engine", "html")

//会对指定类型进行 Base64 编码
app.binaryTypes = ['*/*'];

//静态 web 服务
app.use(express.static("public"));
// Routes
app.get(`/`, (req, res) => {
  res.render("index", {
    title: "你好 serverless"
  })
});

//注意:https://github.com/serverless-components/tencent-koa/blob/master/docs/upload.md
app.post(`/doUpload`, upload.single("face"), async (req, res) => {
  console.log(req.body);
  console.log(req.file);

  //上传本地图片到对象云存储里面   注意异步
  let result = await tools.uploadCos(req.file.originalname, req.file.buffer)

  res.send({
    body: req.body,
    result: result
  });
});


// Error handler
app.use(function (err, req, res, next) {
  console.error(err);
  res.status(500).send('Internal Serverless Error');
});

module.exports = app;
// services/tools.js
const COS = require('cos-nodejs-sdk-v5');

module.exports={
  uploadCos(filename,source){
    let cos = new COS({
      SecretId: 'xx',
      SecretKey: 'xx'
    });
    return new Promise((reslove, reject) => {
      cos.putObject({
        Bucket: 'test-xx', /* 必须 */
        Region: 'ap-beijing',    /* 必须 */
        Key: 'test/' + filename,              /* 必须 test 为目录名称 */
        StorageClass: 'STANDARD',
        Body: source, // 上传文件对象
        onProgress: function (progressData) {
          console.log(JSON.stringify(progressData));
        }
      }, function (err, data) {
          if(err){
              reject(err);
          }else{
              reslove(data);
          }
        
      });
    })
  }
}

上传文件需要注意

https://github.com/serverless-components/tencent-koa/blob/master/docs/upload.md

修改 serverless.yml

app: appDemo
stage: dev
component: koa
name: koaDemo

inputs:
  # 省略...
  apigatewayConf:
    isBase64Encoded: true # 需要加上,否则上传图片到 cos 预览有问题
    # 省略...
  # 省略...

完整 serverless.yml

app: expressdemo
component: express
name: expressDemo
inputs:
  runtime: Nodejs10.15
  region: ap-guangzhou
  src:
    src: ./
    exclude:
      - .env
      - .git
      - node_modules
  apigatewayConf:
    enableCORS: false
    isBase64Encoded: true # 需要加上,否则上传图片到 cos 预览有问题
    protocols:
      - http
      - https
    environment: release

部署,然后在 webIDE 开启自动安装依赖

sls deploy

5.3 Serverless、Cos 中配置域名访问以及 Serverless 中配置 https 访问

Serverless 中配置域名访问

找到云函数对应的 api 网关

编辑 api 网关 点击域名管理

新建域名

解析域名

Serverless 中配置 https 访问

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。

HTTPS 是在 HTTP 的基础上添加了安全层,从原来的明文传输变成密文传输,当然加密与解 密是需要一些时间代价与开销的,不完全统计有 10 倍的差异。

在当下的网络环境下可以忽 略不计,已经成为一种必然趋势。 目前微信小程序请求 Api 必须用 https、Ios 请求 api 接口必须用 https

https 证书类型

  • 域名型 https 证书(DVSSL):信任等级一般,只需验证网站的真实性便可颁发证书保护网站
  • 企业型 https 证书(OVSSL):信任等级强,须要验证企业的身份,审核严格,安全性更高
  • 增强型 https 证书(EVSSL):信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高, 同时可以激活绿色网址栏

创建证书

选择证书

Cos 中配置域名

配置域名

域名解析

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文