专栏首页Serverless的前端项目实践【腾讯云Serverless】记一次使用腾讯云Serverless的VS Code插件来定位问题
原创

【腾讯云Serverless】记一次使用腾讯云Serverless的VS Code插件来定位问题

近日发现了一个比较有趣的库,co-wechat

该库封装了微信公共平台消息接口,并将其作为中间件的形式,配合express,koa等框架使用。

所以尝试着配合腾讯云Serverless,api网关以及该库,做一个自动回复的机器人。

根据微信公众平台技术文档中的指引进行了 个人订阅号的申请,开发者基本配置。以及根据腾讯云云函数文档完成云函数的创建以及Api网关触发器的配置,这里就不一一赘述。跟着文档做就行了。

一开始,跟着co-wechat以及serverless-http的文档写出来以下代码:

"use strict";
const Koa = require("koa");
const serverless = require("serverless-http");
const wechat = require("co-wechat");
const config = {
  token: 'token',
  appid: 'appid',
  encodingAESKey: 'encodinAESKey',
};

const app = new Koa();

app.use(
  wechat(config).middleware(async (message, ctx) => {
    console.log(message);
    // 微信输入信息就是这个 message
    if (message.FromUserName === "作者") {
      // 回复屌丝(普通回复)
      return "hehe";
    } else if (message.MsgType === "text") {
      //你也可以这样回复text类型的信息
      return {
        content: "diaosi",
        type: "text"
      };
    } else if (message.FromUserName === "hehe") {
      // 回复一段音乐
      return {
        type: "music",
        content: {
          title: "来段音乐吧",
          description: "一无所有",
          musicUrl: "http://mp3.com/xx.mp3",
          hqMusicUrl: "http://mp3.com/xx.mp3"
        }
      };
    } else if (message.FromUserName === "kf") {
      // 转发到客服接口
      return {
        type: "customerService",
        kfAccount: "test1@test"
      };
    } else {
      // 回复高富帅(图文回复)
      return [
        {
          title: "你来我家接我吧",
          description: "这是女神与高富帅之间的对话",
          picurl: "http://nodeapi.cloudfoundry.com/qrcode.jpg",
          url: "http://nodeapi.cloudfoundry.com/"
        }
      ];
    }
  })
);

const handler = serverless(app);
exports.main_handler = async (event, context, callback) => {
  return await handler(event, context);
};

并上传到腾讯云Serverless中,同时在微信公众号发送了一个词语,触发了一次云函数:

但是,我却得到了这个错误。

错误可能情况有如下几种:

1、云函数执行错误,这个可以否掉了,因为看起来并不像

2、代码逻辑错误,这个也可以否掉了,基本都是看文档,CV文档的demo代码,流行库的demo代码基本没啥问题。

3、微信公众号的相关配置错误,这个也可以否掉,跟着文档一步步走的,除非我的阅读理解有问题。

4、依赖的第三方库,co-wechat以及serverless-http的处理有问题。

错误可能情况4比较有可能,但是线上的日志查看已经无法继续定位问题,不过幸好腾讯云Serverless还提供了另一个利器:

Tencent Serverless Toolkit for VS Code

所以,我开始使用该VS Code插件进行本地调试。

为了完全模拟微信公众号发来的请求信息,我现在控制台的日志中,CV了一份请求信息,并使用VS Code插件新增了一个Api网关的测试模板。

并在.vscode文件夹下,新建一个launch.json,使用快捷键生成了debugger的scf的调试配置,并加上了cwd,指定工作空间。

由于怀疑是co-wechat库的问题,所以去node_modules下的co-wehcat的源码中看了看,发现他们源码中的确有返回:

但是是哪里出了问题呢,所以我在这附近打了个 断点。

并F5,选择了我新建的测试模板,开始debug。

跳到断点处,发现,这个库返回这个错误的原因在于这一句if代码判断微信发给云函数的签名,即signature与库自己算出来的不一致。然后我再在watch栏添加了这两个值,发现微信发给云函数的签名,不见了!

为什么会不见呢?

我的测试模板中,是明确带着的,大家可以回到上面的测试模板的图可以看到queryString中的signature是有值的。

我再在watch栏查看了ctx.query的值。

空对象!

那问题就基本可以定位在 serverless-http这个库了。

去到该库的源代码,在create-request文件中发现了如下代码:

一目了然。原因为:serverless-http并没有很好兼容腾讯云Api网关的请求格式。腾讯云Api网关的请求格式中,queryString存放着请求的query string,但是serverless-http只取图中两个参数名的值作为express,koa等的query参数的值,没有取queryString参数的值

靠着Tencent Serverless Toolkit for VS Code定位了到了问题,所以我在代码中做下兼容,即解决了这个问题。并运行成功,做了个简单的自动回复机器人~

exports.main_handler = async (event, context, callback) => {
  event.queryStringParameters = event.queryString;

  return await handler(
    { ...event, queryStringParameters: event.queryString },
    context
  );
};

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【腾讯云Serverless】使用云函数快速打造一个智障微信公众号自动回复机器人

    于上周五发现了一个有趣的仓库: co-wechat。突发奇想,我不要你觉得,我要我觉得,腾讯云云函数配合该库,理论上可以快速搭建一个微信公众号的自动回复机器人。...

    Juli
  • 【腾讯云Serverless】腾讯云Serverless + Typescript实践

    最近serverless愈来愈火,我刚好在培训,比较有时间去尝试一些新东西,所以趁这个时候去使用下serverless,尝试使用typescript和node...

    Juli
  • 【腾讯云Serverless】Github Actions自动部署云函数

    Github Actions是Github近来推出的新功能,能够自动化构建,部署我们的github项目。

    Juli
  • Django中Celery的定时任务集群部署(三)

    Django中Celery的使用,本章主机要介绍celery定时任务部署多台主机,不同主机定时任务不同,统一通过django后台管理

    菲宇
  • javascript 红皮高程(16)

    位操作符的内容有些难度,并且也不常用。 从这几天的文章阅读量可以看出来,阅读的人比较少。 但学习这事,从来都是一件艰苦的事情,从来不轻松。 也许难懂,多看几遍就...

    web前端教室
  • 二叉查找树编码与解码

    LeetCode 449 给定一个二叉查找树,实现对该二叉查找树编码与解码功能。编码即将二叉查找树转为字符串,解码即将字符串转为二叉查找树。不限制使用何种编码...

    小飞侠xp
  • akka-grpc - 应用案例

    上期说道:http/2还属于一种不算普及的技术协议,可能目前只适合用于内部系统集成,现在开始大面积介入可能为时尚早。不过有些项目需求不等人,需要使用这项技术,...

    用户1150956
  • 【翻译】忘了RxJava吧——你需要的是拥抱Kotlin协程(Part 1/2)

    2018-08-31 by Liuqingwen | Tags: Kotlin Android 翻译 | Hits

    IT自学不成才
  • 浅谈数据可视化那些可用的工具和示例【可视化】

    什么是数据可视化?数据可视化主要旨在借助于图形化手段,清晰有效地传达与沟通信息。为了有效地传达思想概念,美学形式与功能需要齐头并进,通过直观地传达关键的方面与特...

    灯塔大数据
  • R语言绘图 | 给箱线图加个点

    ggpubr是一个广泛应用于学术绘图的R包,可以让我们轻松绘制出用于发表的高质量图形。

    生信小王子

扫码关注云+社区

领取腾讯云代金券