在开发语音代理时,我正在使用 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);
我是语音代理的新手,尤其是 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);