调试 IBM Cloud 函数
Posted
技术标签:
【中文标题】调试 IBM Cloud 函数【英文标题】:Debugging IBM Cloud Function 【发布时间】:2022-01-03 15:14:18 【问题描述】:我开始研究 IBM Cloud Functions(NodeJS 运行时),我想知道是否有人能够在他的本地机器上调试函数。
假设有一个返回 json 的简单 NodeJs 函数。
const md5 = require('spark-md5');
function myAction(params)
// params contain the "rows" coming from Cloudant including the full documents
return
entries: params.rows.map((row) => return
name: row.doc.name,
email: row.doc.email,
comment: row.doc.comment,
createdAt: row.doc.createdAt,
icon: (row.doc.email ? `https://secure.gravatar.com/avatar/$md5.hash(row.doc.email.trim().toLowerCase())?s=64` : null)
)
;
exports.main = myAction;
我想要断点和逐步调试。 在 IBM Cloud Functions 上部署此功能之前,如何对其进行调试? 我真的不知道如何传递输入和查看输出。我习惯使用 Postman 来测试我的后端,但在这里我有点困惑,不知道从哪里开始。
【问题讨论】:
您能否编辑您的问题以专注于特定问题?就个人而言,我在本地开发代码,然后将其移动到云功能中。重要的是要了解输入和预期输出。 我删除了一些关于问题的无用抱怨并添加了一个示例。 【参考方案1】:我通常解决此类问题的方法是分解我的代码并以一种我可以“插入”到我知道如何运行和调试的方式导出它。实际上,就如何组织代码而言,您已经做到了这一点。您的云函数是一个接受 params
参数的函数,返回一个对象,并使用 exports.main = myAction;
导出它。
要在本地测试它,包括在调试器中运行它,我会创建一个入口点文件,该文件会导入该操作并调用它。我可以在不启用调试器的情况下运行该文件,依靠console.log
来帮助我调试(我会在部署到生产之前将其删除),或者我可以使用调试器运行它。
// main.js
const action = require('./action').main;
const actionResult = action(
rows: [
doc:
name: 'Jane',
email: 'jane@example.com',
comment: 'Lovely day, isn\'t it?',
createdAt: new Date(),
,
,
],
);
console.log('Result:', result);
要在 VS Code 中使用调试器运行它,当我打开文件并获得焦点时,我会单击“运行并调试”:
我会选择“Node.js”:
调试器运行时,我设置的任何断点,尤其是动作文件中的一个断点,都会被命中:
我可以查看动作执行时的状态:
如果我想进行更高级的测试,以更接近将我的操作部署为 Web 操作的方式,我会设置一个 Express.js 应用程序并制作使用该操作作为 Express.js 中间件的适配器。因为 JS 动作的签名与 Express.js 作为中间件不兼容,所以我必须编写一个适配器:
const express = require('express');
const action = require('./action').main;
const app = express();
app.use(express.json());
app.post('/', function (req, res)
const actionInput = req.body; // JSON request results in object here
const actionResult = action(actionInput);
res.json(actionResult);
);
app.listen(3000);
就像上面一样,在 VS Code 中,我可以使用断点调试它并检查状态。请注意我的 Insomnia 屏幕截图中请求正文中使用的 ISO8601 字符串:
【讨论】:
感谢您的详尽解释。以上是关于调试 IBM Cloud 函数的主要内容,如果未能解决你的问题,请参考以下文章
IBM 发布Cloud Private:基于Kubernetes和Cloud Foundry
在 IBM-Cloud-cloud 对象存储中保留啥作为网络鸭连接服务器端点 URL
防止 terraform 函数“模板文件”输出 heredoc