VS Code中的函数调试

时间:2017-08-28 13:16:40

标签: debugging firebase visual-studio-code google-cloud-functions

VS Code集成终端我运行firebase serve --only functions,hosting 然后在调试选项卡中我创建了默认的launch.json:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Program",
      "program": "${file}"
    }
  ]
}

我想调试服务器端(functions / index.js)而不是客户端。

我已经尝试了https://code.visualstudio.com/docs/nodejs/nodejs-debugging的一些配置而没有运气。

如何在VS代码中调试Firebase功能?

6 个答案:

答案 0 :(得分:4)

您无法在不首先定义Firebase配置变量的情况下调试Firebase功能。 Firebase CLI为您完成。

要进行调试,您可以尝试使用与Firebase功能单元测试相同的技巧。

在致电admin.initializeApp(functions.config().firebase)

之前,将以下行添加到index.js文件中
admin.initializeApp = function () {}
functions.config = function() {
    return {
        firebase: {
          databaseURL: 'https://not-a-project.firebaseio.com',
          storageBucket: 'not-a-project.appspot.com',
        }
    };
}

您现在可以使用与任何其他Google云功能相同的方式调试Firebase功能:

  1. 安装云功能模拟器:

    npm install -g @google-cloud/functions-emulator
    
  2. 启动模拟器:

    functions start
    
  3. 部署您的功能:

    functions deploy helloWorldFunction --trigger-http
    

    您将获得如下输出:

    Waiting for operation to finish...done.
    Deploying function........done.
    Function helloWorldFunction deployed.
    
    Property | Value
    ---------|------------------------------------------------------------------------
    Name     | helloWorldFunction
    Trigger  | HTTP
    Resource | http://localhost:8010/helloWorldProject/us-central1/helloWorldFunction
    
  4. 使用标准Node.js调试器类型进行调试:

    functions debug helloWorldFunction
    

    你会得到:

    Debugger for helloWorldFunction listening on port 5858.
    
  5. 现在将以下行添加到launch.json VS Code

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Node.JS (local)",
                "type": "node",
                "request": "attach",
                "port": 5858
            }
        ]
    }
    
  6. 在您的VS代码中开始调试,并通过调用您已执行步骤#3的URL来触发您的功能。

    您也可以在终端输入functions call helloWorldFunction来触发此功能。

  7. 有关详细信息,请参阅此处Cloud Functions Local Emulator中的说明。

答案 1 :(得分:2)

更新:2019年12月19日
现在可以调试( 放置断点 )在VSCode上本地运行的firebase函数。

1)将firebase-tools更新为至少 v7.11.0 npm i -g firebase-tools
2)将以下内容添加到launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "attach",
      "name": "Attach",
      "port": 9229,
      "restart": true,
      "skipFiles": ["<node_internals>/**"]
    }
  ]
}

3)运行仿真器:firebase emulators:start --inspect-functions
4)使用attach选项运行vscode调试器。

注意:如果要从本地Firebase托管设置测试功能,则需要将托管功能指向本地服务器而不是云服务器。参见此处https://stackoverflow.com/a/59381328/3073272


关于使用终端调试(无断点)firebase功能的旧答案:

有一个Testing functions interactively使用shell的firebase文档。您还可以测试https可调用函数。尽管这里没有提到附加调试器的步骤。

1)打开Goog​​le Cloud Console的“服务帐户”窗格。
2)确保选择了App Engine默认服务帐户,然后使用右侧的选项菜单选择创建密钥。
3)出现提示时,选择JSON作为密钥类型,然后单击“创建”。
4)将您的Google默认凭据设置为指向已下载的密钥

$ set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json

$ firebase functions:shell

Cloud Functions Shell通过交互式Shell模拟所有类型的功能触发器,以使用测试数据调用功能。选项因功能类型而异,但基本用法格式为:

myFunctionName(data, options)

答案 2 :(得分:1)

  • npm install -g @ google-cloud / functions-emulator

  • /functions/index.js

const admin = require('firebase-admin');

if (!admin.apps.length)
    admin.initializeApp({
    apiKey: "... your api key",
    authDomain: "... your auth domain",
    databaseURL: "... your database url",
    projectId: "... your project id",
    storageBucket: "... your storage bucket",
    messagingSenderId: "... your messaging sender id"
});
  • /。vscode / launch.json
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "attach",
            "name": "Attach Firebase",
            "port": 9229,
            "preLaunchTask": "Google Cloud Emulator"
        }
    ]
}
  • /。vscode / tasks.json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
    {
        "label": "Start",
        "type": "shell",
        "command": "functions",
        "isBackground": true,
        "args": [
            "start"
        ],
        "group": "build"
    },
    {
        "label": "Deploy",
        "type": "shell",
        "command": "functions",
        "isBackground": true,
        "options": {
            "cwd": "${workspaceFolder}/functions/"
        },
        "args": [
            "deploy",
            "--trigger-http",
            "--timeout",
            "600s",
            "api"
        ],
        "dependsOn": [
            "Start"
        ],
        "group": "build"
    },
    {
        "label": "Inspect",
        "type": "shell",
        "command": "functions",
        "isBackground": true,
        "options": {
            "cwd": "${workspaceFolder}/functions/"
        },
        "args": [
            "inspect",
            "api"
        ],
        "dependsOn": [
            "Deploy"
        ],
        "group": "build"
    },
    {
        "label": "Google Cloud Emulator",
        "dependsOn": [
            "Inspect",
        ],
        "group": "build"
    },
]

}

  • 开始调试“附加Firebase”

答案 3 :(得分:0)

我刚刚在另一个问题上使用Firebase Functions v1.0回复了这个问题: Debugging firebase cloud functions

您可以使用Firebase函数1.0使其在Visual Studio代码上运行,而无需更改功能代码上的任何内容。

在运行functions deploy命令时,您基本上只需要正确设置FIREBASE_CONFIG环境变量。 喜欢的东西(别忘了逃避“人物”):

FIREBASE_CONFIG="{\"databaseURL\":\"https://YOUR-FIREBASE-PROJECT.firebaseio.com\",\"storageBucket\":\"YOUR-FIREBASE-PROJECT.appspot.com\",\"projectId\":\"YOUR-FIREBASE-PROJECT\"}
functions deploy --trigger-http --timeout 600s FUNCTION_NAME

之后,您只需使用functions debug FUNCTION_NAME来启动该功能并附加您的vs Code调试器。

答案 4 :(得分:0)

找到了。

  1. 添加到launch.json:
NeighbourhoodOther.TimeCreated
  1. 运行:
JSONObject obj = neighOtherObject.getJSONObject("time_created");
NeighbourhoodOther.TimeCreated temp = new NeighbourhoodOther.TimeCreated()
temp.timezone = obj.getString("timezone");
... fill in NeighbourhoodOther.TimeCreated members

答案 5 :(得分:0)

这是我的解决方法:

我在{root} /src/koios/index.js中有一个http Google Cloud Function

{root} /src/koios/package.json

"scripts": {
    "start": "env URL=xxx.xxx.com node --inspect-brk=9229 node_modules/@google-cloud/functions-framework --target=queryElasticsearch --port=8888"
  }

{root} /。vscode / launch.json

{
            "type": "node",
            "request": "launch",
            "name": "Launch koios via npm",
            "cwd": "${workspaceFolder}/src/koios",
            "runtimeExecutable": "npm",
            "runtimeArgs": ["run-script", "start"],
            "port": 9229
        }

开始在vscode中调试,然后通过邮递员发帖触发它,您可以在vscode中的Cloud Function代码中找到断点。

享受编码!