调试 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 函数的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Code 函数运行两次

IBM 发布Cloud Private:基于Kubernetes和Cloud Foundry

在 IBM-Cloud-cloud 对象存储中保留啥作为网络鸭连接服务器端点 URL

防止 terraform 函数“模板文件”输出 heredoc

markdown 通过IBM Cloud CLI订购ICOS

IBM Cloud Functions:在 Nodejs 中使用异步调用