【问题标题】:Debugging IBM Cloud Function调试 IBM Cloud 函数
【发布时间】: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 来测试我的后端,但在这里我有点困惑,不知道从哪里开始。

【问题讨论】:

  • 您能否编辑您的问题以专注于特定问题?就个人而言,我在本地开发代码,然后将其移动到云功能中。重要的是要了解输入和预期输出。
  • 我删除了一些关于问题的无用抱怨并添加了一个示例。

标签: debugging ibm-cloud openwhisk ibm-cloud-functions


【解决方案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 字符串:

【讨论】:

  • 感谢您的详尽解释。
猜你喜欢
  • 2020-03-24
  • 2021-05-03
  • 2022-01-04
  • 2019-10-19
  • 1970-01-01
  • 2020-07-05
  • 2021-06-18
  • 1970-01-01
  • 2018-08-23
相关资源
最近更新 更多