# 云、云原生、Serverless、云函数的小思考与腾讯云Serverless云函数Koa服务日志打印undefined的解决

> 作者：zning（https://ning.ae） · 发布：2021/09/06 18:22 下午 (UTC+8) · 原文：https://zning.me/16309237786462.html

最近在研究腾讯云的Serverless，发现云函数和无服务器化这块虽说国内与AWS Lambda差不多先后发展，但是目前来看一些便捷程度还是需要努力一把啊。

不过，整体而言，作为云时代的应用来说，FaaS、Serverless、云函数等基于云本身演化出来的SaaS产品，更代表了下一代云应用以及CNCF所贯彻的云原生的理念。毕竟作为云计算从2009年开始由亚马逊衍生发展，一直以来包括我在内，很多人对云上应用都持有一种保守的目光看待：云的服务与传统IDC提供的包括虚拟化服务在内的各种服务有什么区别吗？

其实在很长一段时间，这个问题无论云计算厂商如何吹的天花乱坠，仍然都摆脱不了云服务器本身与IDC相关服务的同质化情况。直到近两年，由各大厂商加盟组织的CNCF，开始对这个问题有了明确的思考与回答：真正的云的应用，应该是从云而生的（即云原生Cloud Native）。

当然，云原生的得以实现，离不开IaaS和PaaS自云计算兴起以来各路大神和开源社区的卓越贡献，毕竟作为云原生的土壤，云基础设施的稳健与巩固是云原生能够推广的关键。这也是我国在“十四五”期间将新一代大数据中心的建设纳入“新基建”七大领域之一的原因之一。

作为一名技术从业人员的角度来看，云原生将逐步降低应用的开发周期，提高应用迭代效率，尤其是对于中小企业和大企业中作为辅助相关的业务开发来说，云原生的应用场景和费用支出都是比传统应用架构开发模式的性价比更高。而云原生相关的开发岗位，预计也将会逐步进入各非互联网行业招聘信息的视野主流，而不仅仅只在互联网行业发展。

而从非技术从业角度来看，云原生不仅降低了应用开发周期，更可以降低非技术从业人员参与业务开发的门槛，在去年参加的腾讯云云开发CTO交流日北京站的技术沙龙活动上，可以看到厂商都在这方面有做很多努力：云开发的应用可预留更多可配置项目，让非技术人员可以根据业务需求及时调整，从而增加业务的快速启动。

![IMG_4199](media/16309237786462/IMG_4199.jpg)
![IMG_0932](media/16309237786462/IMG_0932.jpeg)

> 去年参加腾讯云云开发CTO交流日·北京站，对于Serverless和云开发的现状有了一定了解

不过这样的发展，对于一些只能CRUD相关业务系统的从业者来说不是什么好事，因为这些需求企业有了更具性价比的业务启动思路，可能开发只需要一个人，配合多个业务人员来做就可以，不需要太多开发相关岗位了。这在去年的CTO交流日活动上与其他与会者的交流中，是一个比较认同的点。

关于云原生时代的职业影响这个话题，可以回头有空再独立探讨。接下来解决一下实际问题：腾讯云Serverless Koa服务部署后日志打印Undefined的解决。

前两天有个需求，因为懒得搭建全套Web，因此瞄准了Serverless。不过我一直没怎么实际接触过Serverless部署，只能摸着石头过河。后来经过搜索和高人指点，最终选择了腾讯云Serverless的Node.js Koa的示例工程进行开发实现。当然Koa这个下一代Web Framework，我也是第一次使用，两眼一抹黑全部都是新的，都是要慢慢搞。

这其中就踩了一个坑：在传入post请求时，Demo工程打印的是`undefined`。如下图：

![image-20210906161400392](media/16309237786462/image-20210906161400392.png)

![image-20210906155927733](media/16309237786462/image-20210906155927733.png)

究其原因，其实还是挺简单的：因为腾讯云云函数服务提供的koa并没有引入`koa-bosyparser`这个组件，所以我们需要安装一下。

在这里也有个小坑：koa工程是在代码的`src`目录下，所以需要先进该目录操作。另外在操作时需要先将文件夹`node_module`、`yarn.lock`、`package-lock.json`全部删除。

后在头部加入该组件引用代码：

```javascript
const bodyParser = require('koa-bodyparser')
```

之后修改`app.use(router.allowedMethods()).use(router.routes())`这行代码为：

```javascript
app.use(router.allowedMethods()).use(bodyParser()).use(router.routes())
```

最后打开终端（这玩意是Coding的Cloud Studio，也就是VS Code的Web开源版本，跟VS Code用法完全一致）执行命令：

```shell
yarn add koa-bodyparser
```

修改如图：

![image-20210906161013708](media/16309237786462/image-20210906161013708.png)

保存后，点击部署，部署完成后我们再测试一下：

![image-20210906161440946](media/16309237786462/image-20210906161440946.png)

大功告成。

最后给两张图，关于Serverless云函数创建Koa框架模板相关步骤：

1. 创建第一步：

	![image-20210906154440510](media/16309237786462/image-20210906154440510.png)

2. 创建第二步：

    ![image-20210906154718289](media/16309237786462/image-20210906154718289.png)

3. 创建后初始化代码（post方法nice是我添加的）：

    ![image-20210906155747383](media/16309237786462/image-20210906155747383.png)
