MemFire 教程 | 如何在本地调试云函数

MemFire Cloud云函数,是运行在云端(服务器端)的、无关联、可重复使用的函数代码。使用MemFire Cloud云函数,您无需购买、管理服务器等基础设施,只需编写和上传代码。MemFire Cloud云函数为您准备好了计算资源,可以弹性、可靠的运行任务,从而可轻松构建任何类型的应用和服务。

本篇文章将向你介绍当你在MemFire Cloud上使用云函数时,如何在本地进行云函数的调试。

准备工作

  • 创建应用
  • 在应用的SQL编辑器里创建数据表tasks,并插入一条数据,为接下来云函数的调用做准备。
create table
  public.tasks (
    id bigint generated by default as identity,
    created_at timestamp with time zone not null default now(),
    task text null,
    constraint tasks_pkey primary key (id)
  ) tablespace pg_default;
  
  INSERT INTO tasks (id, created_at , task ) VALUES
(1, '2019-04-22 14:33:41', '第一')

执行上述命令结果如下:
在这里插入图片描述

第一步:云函数的代码开发

云函数开发可参考教程:https://docs.memfiredb.com/docs/app/development_guide/functions/code-development/

接下来,我将带领大家如何来开发一个云函数。

  • 新建一个空的项目文件,在文件夹下创建云函数示例代码index.js
const sup = require('@supabase/supabase-js')

// supabase客户端
let supabase

// 云函数入口文件
exports.handler = async (req, resp, context) => {

    // 解决跨域问题
    resp.setHeader('Access-Control-Allow-Origin', '*') // *可以改成你的服务域名
    resp.setHeader('Access-Control-Allow-Methods', '*');
    resp.setHeader('Access-Control-Allow-Headers', '*');
    resp.setHeader('Access-Control-Max-Age', '3600');
    
    supabase = sup.createClient('URL', 'anon_key')

    /** 请求参数
     * method: 请求方法
     * queries: 请求参数
     * headers: 请求头
     * body: 请求体, 为 Buffer 类型
   */
    const { method, queries, headers, body } = req

    const { action } = queries

    // 解决跨域问题
    if (req.method === 'OPTIONS') {
        resp.setStatusCode(204)
        resp.send('');
    } else if (method === 'GET') {

        // 获取请求参数

        const { data, error} = await supabase
            .from('tasks')
            .select('*')
      if (error) {
        // 返回响应
        resp.setStatusCode(403)
        resp.setHeader('Content-Type', 'application/json')
        resp.send(JSON.stringify({
          status: 403
        }))
      }

        resp.setStatusCode(200)
        resp.setHeader('Content-Type', 'application/json')
        resp.send(JSON.stringify(data))

    } else if (method === 'POST') {                                                                    

        try {
            const result = JSON.parse(req.body.toString())

            const { data, error } = await supabase.from('tasks').insert({ task: result.task })

        } catch (err) {
            const result = JSON.parse(req.body.toString())
            resp.setStatusCode(500)
            resp.setHeader('Content-Type', 'application/json')
            resp.send(JSON.stringify({
                code: 'FAIL',
                message: JSON.stringify(result) + JSON.stringify(err)
            }))
        }

        resp.setStatusCode(200)
        resp.setHeader('Content-Type', 'application/json')
        resp.send(JSON.stringify({
            code: 'SUCCESS',
        }))

    } else if (method === 'DELETE') {
        // 获取请求参数
        try {
            const { id} = queries
            const { data, error } = await supabase.from('tasks').delete().eq('id', id)

        } catch (err) {
            resp.setStatusCode(500)
            resp.setHeader('Content-Type', 'application/json')
            resp.send(JSON.stringify({
                code: 'FAIL',
                message: err
            }))
        }

        // 返回响应
        resp.setStatusCode(200)
        resp.setHeader('Content-Type', 'application/json')
        resp.send(JSON.stringify({
            code: 'SUCCESS',
        }))

    }
    else {
        resp.setStatusCode(200)
        resp.setHeader('Content-Type', 'application/json')
        resp.send(JSON.stringify({
            code: 404,
            msg: 'not found'
        }))
    }

}

如需访问MemFire Cloud的应用,请安装@supabase/supabase-js依赖包,并在代码内(第16行)填写应用的URLanon_key

  • 安装依赖包
npm i @supabase/supabase-js

第二步:创建本地服务器

您需要创建一个简单的HTTP服务器来处理和响应请求。这可以通过使用Node.js内置的http或者express模块来实现。

使用http模块
  • 在项目文件的目录下新建一个server.js文件。
  • 需要引入Node.js的http模块,并使用您的index.js中定义的handler函数。
const http = require('http');
const { handler } = require('./index');

const server = http.createServer((req, res) => {
    let body = '';

    req.on('data', chunk => {
        body += chunk; // 如果预期的请求会带有数据,可以在这里处理
    });

    req.on('end', () => {
        // 模拟一下req对象中其他属性和方法
        req.queries = {}; // 如果您的请求 URL 有查询字符串,您需要手动解析
        req.path = req.url; // 简单处理,实际情况可能需要解析URL
        req.method = req.method;
        req.url = req.url;
        req.clientIP = req.socket.remoteAddress;
        // 设置状态码的方法
        res.setStatusCode = function(statusCode) {
            this.statusCode = statusCode;
        };
        // 发送响应的方法
        res.send = function(data) {
            this.setHeader("Content-Type", "application/json");
            this.end(data);
        };
        // 用模拟的req和原生res对象调用您的handler
        handler(req, res, {}); // 这里简单传递了一个空对象作为context
    });
});

const PORT = 3000;
server.listen(PORT, () => {
    console.log(`服务器运行在 http://localhost:${PORT}`);
});

第三步.运行本地服务器

  • 确保您已经安装好Node.js环境。
  • 打开命令行工具,导航到包含您的项目文件的目录。
  • 运行node server.js来启动服务器。

第四步:调试服务

您可以使用各种工具来测试您的服务。最简单的方式是使用浏览器或者命令行工具如curl

这里我们选择curl来调试服务
在这里插入图片描述

以上是通过GET请求获取表数据,您也可以使用其他请求方式,只要遵循curl 操作指令就行。

文档地址

https://docs.memfiredb.com/docs/app/development_guide/functions/fn-local-test/

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值