调试 IBM 云功能

Debugging IBM Cloud Function

我开始研究 IBM Cloud Functions(NodeJS 运行时),我想知道是否有人能够在他的本地机器上调试函数。

假设有一个简单的 NodeJs 函数,其中 returns 一个 json。

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 之前对其进行调试? 我什至不知道如何传递输入并看到 outputs.I 我习惯使用 Postman 来测试我的后端,但在这里我有点困惑,不知道从哪里开始。

我通常解决此类问题的方法是分解我的代码并以一种我可以“插入”到我知道如何 运行 和调试的方式导出它。实际上,就组织代码的方式而言,您已经做到了这一点。您的云函数是一个接受 params 参数、returns 对象的函数,并且您已使用 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”:

使用调试器 运行ning,我设置的任何断点,尤其是动作文件中的断点,都会被触发:

而且我可以在操作执行时查看状态:

如果我想进行更高级的测试,以更接近于将我的操作部署为 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 字符串: