在开发语音代理时,我正在使用 axios 从电子表格中获取数据。但是,我无法一次获取所有数据

While developing a voice agent, I am using axios to get data from a spreadsheet. However, I cannot get all data at once

我是语音代理的新手,尤其是 Javascript。但是,我需要在 Google 操作控制台中开发语音代理。

我的代理最关键的部分是我需要从 google 电子表格中读取数据,我发现我可以使用 Web 服务 SheetDB 将数据从电子表格流式传输到 Web .现在直播 运行ning 在以下link:https://sheetdb.io/api/v1/n3ol4hwmfsmqd

我还设置了一个 webhook,以通过 firebase 中的云功能从流中检索数据。这是我现在拥有的云功能:

const { conversation } = require('@assistant/conversation');
const functions = require('firebase-functions');
const axios = require('axios');

const app = conversation({debug: true});

app.handle('getItem', conv => {

    getItem();
    conv.add("This test to see if we are accessing the webhook");
});

function getData() {
    return axios.get('https://sheetdb.io/api/v1/n3ol4hwmfsmqd');
}

function getItem() {
    getData().then(res => {
        console.log(res.data);
    });
}

exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);

我在这里尝试做的是,在对话中,我调用 getItem() 函数,该函数基本上读取数据并将其打印到控制台。 getData() 函数使用 axios 插件从 SheetDB 读取数据。

但是,当我 运行 从我的函数中读取代理和数据时,数据被拆分为多个日志消息。这是云功能的控制台登录:

2:04:27.925 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
Function execution took 378 ms, finished with status code: 200 
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
[ { Item: 'Beam B-1',
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
Level: '2',
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
Zone: 'A',
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
Location: 'Beam B-1 is located on Level 2 in zone A',
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
Responsible: 'Contractor' },
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
{ Item: 'Column C-2',
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
Level: '3',
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
Zone: 'A',
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
Location: 'Column C-2 is located on Level 3 in zone A',
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
Responsible: 'Kiewit' },
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
{ Item: 'Window B',
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
Level: '2',
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
Zone: 'B',
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
Location: 'Window B is located on Level 2 in zone B',
2:04:30.645 PM
cf-hfyNV-ZVWlECkylj8TUN1w-name
Responsible: 'Tech' } ]

完整的数据是这样的:

[{"Item":"Beam B-1","Level":"2","Zone":"A","Location":"Beam B-1 is located on Level 2 in zone A","Responsible":"Contractor"},{"Item":"Column C-2","Level":"3","Zone":"A","Location":"Column C-2 is located on Level 3 in zone A","Responsible":"Kiewit"},{"Item":"Window B","Level":"2","Zone":"B","Location":"Window B is located on Level 2 in zone B","Responsible":"Tech"}]

问题是我需要一次读取数据,换句话说,应该打印在单个日志中以便能够解析它并检索我需要的数据。

我已经为此苦苦挣扎了一段时间,所以我希望有人能帮助我。如果您需要更多详细信息,请告诉我。

我不熟悉 Firebase Functions,也许这就是他们呈现日志的方式?

您是否已尝试访问 res.data 中的数据?

我不明白为什么你不能在里面“拥有一切”和 manipulate/access 你想要的任何东西。您的代码似乎没问题。

啊,因为你是 JavaScript 的新手,所以我认为重要的是要强调你所拥有的(响应)是一个 对象数组 .

所以请注意,有时访问其中的属性可能很棘手。

您的代码看起来有点正确,但您需要考虑您的使用方式 Promises。它们是异步的,这意味着异步操作下面的代码甚至可以在第一个操作完成之前 运行。

因此,当您 运行 getItem() 然后 conv.add 时,您不能保证已完成数据库操作。这是使用 async/await keywords 的地方,它可以更容易地以顺序方式管理异步操作。

另一个问题与您的日志记录更直接相关。默认情况下,Firebase Functions 会将结果分成单独的行,如您所见。关于如何使用他们自己的日志记录 SDK 或如何直接修复日志记录问题,more documentation

考虑到这两点,这里有一个稍微更新的代码版本,应该 运行 符合预期。

const { conversation } = require('@assistant/conversation');
const functions = require('firebase-functions');
require('firebase-functions/lib/logger/compat'); // console.log compat
const axios = require('axios');

const app = conversation({debug: true});

app.handle('getItem', async conv => {
    const data = await getItem();
    conv.add("This test to see if we are accessing the webhook");
});

function getData() {
    // This returns a Promise
    return axios.get('https://sheetdb.io/api/v1/n3ol4hwmfsmqd');
}

async function getItem() {
    const res = await getData()
    console.log(res.data);
    return data // To use in your Action's response
}

exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);