gpt4 book ai didi

javascript - 如何实现两组代码?

转载 作者:行者123 更新时间:2023-11-30 09:18:15 24 4
gpt4 key购买 nike

我正在 Dialogflow 上制作一个可以做各种事情的聊天机器人(我基本上遵循了 Dialogflow 发布的一些教程,稍微重新格式化了代码并为我自己做了一些调整)。

代码很长,所以我会在下面放一个Github的链接。另外,我在 dialogflow 上使用内联编辑器

问题/我不太确定该怎么做是我有一个用户登录部分(第 33 到 51 行),用户可以在其中通过语音登录到他们的谷歌帐户。

在教程中,在实现行中(我几乎可以肯定这就是它不起作用的原因):

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app)

但问题是,要完成我需要的其他功能:

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
..... Functions under }

我曾尝试编写变体,认为这可能有效:

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((app, request, response)

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app(request, response)
// Syntax error

我怎样才能让两部分代码一起工作?是否可以这样做,或者我是否必须再次重新格式化,或者我是否只需要对 fulfillment 行做一些不同的事情?

感谢您的帮助!

代码 here

注意:在 Github 上的代码中,我没有更改 fulfillment 行,我只是将其保留为我的其他功能可以运行的形式。 代码已经过登录和工作测试,它不能与我编写的其他功能一起工作。

最佳答案

问题在于,这两个库在设置处理请求/响应对象的监听器和设置意图处理程序注册方面有不同的方式。你不能把两者混在一起(正如你所发现的)。您需要选择一个并转换以另一种方式注册的功能。

为了节省我自己的大量输入,我将把 actions-on-google 库称为 a-o-g,将 dialogflow-fulfillment 库称为 d-f。

使用 actions-on-google 库

您可以使用类似以下内容初始化监听器:

const app = dialogflow({
// REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
clientId: '<CLIENT ID>',
});

// Intent handler declarations go here

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

转换 dialogflow-fulfillment-style 处理程序相对简单。 a-o-g conv 对象与 d-f agent 对象非常相似。例如,两者都有一个 add() 方法,在处理 Actions 时其行为方式相同。

conv 对象也有一个 parameters 属性,尽管在函数调用中使用第二个参数是首选,它包含相同的东西。同样,它有一个 arguments 属性,其中包含与传递给处理程序的第三个参数相同的内容。

还值得注意的是,app.intent() 不必像箭头函数那样具有其功能,甚至不必像那样指定内联。您可以单独编写函数并将其作为参数传递。

所以你的 makeAppointment() 函数可能会被重写并注册为类似的东西

  function makeAppointment (conv) {
// Calculate appointment start and end datetimes (end = +1hr from start)
const dateTimeStart = new Date(Date.parse(conv.parameters.date.split('T')[0] + 'T' + agent.parameters.time.split('T')[1].split('-')[0] + timeZoneOffset));
const dateTimeEnd = new Date(new Date(dateTimeStart).setHours(dateTimeStart.getHours() + 1));
const appointmentTimeString = dateTimeStart.toLocaleString(
'en-US',
{ month: 'long', day: 'numeric', hour: 'numeric', timeZone: timeZone }
);

// Check the availibility of the time, and make an appointment if there is time on the calendar
return createCalendarEvent(dateTimeStart, dateTimeEnd).then(() => {
conv.add(`Okay, I have you booked for ${appointmentTimeString}!`);
}).catch(() => {
conv.add(`I'm sorry, there are no slots available for ${appointmentTimeString}.`);
});
}
app.intent( 'Make Appointment', makeAppointment );

使用 dialogflow-fulfillment 库

您已经通过这种方式设置了监听器和处理程序

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
const agent = new WebhookClient({ request, response });

// Declare your functions here

let intentMap = new Map();
// Map intent name to functions here
agent.handleRequest(intentMap);
});

所以问题是如何将函数参数中似乎具有 a-o-g 特定信息的处理程序转换为 d-f 兼容的处理程序。

d-f agent 对象有一种获取(几乎)等效的 conv 对象的方法。毫不奇怪,它是 agent.getConv()。真的。然后,您可以如上所述使用 parametersarguments 属性来获取第二个和第三个函数参数的等价物。您将使用 agent.add() 添加一条消息(您也可以使用 conv,但它稍微复杂一些)。

“获取登录”处理程序可能看起来像这样:

function getSignin (agent){
let conv = agent.getConv();
let params = conv.parameters;
let signin = conv.arguments;
if (signin.status === 'OK') {
const payload = conv.user.profile.payload;
agent.ask(`Welcome back ${payload.name}. What do you want to do next?`);
} else {
agent.ask(`I won't be able to save your data, but what do you want to do next?`);
}
}

然后确保在适当的地方注册处理程序

intentMap.set('Get Signin', getSignin);

关于javascript - 如何实现两组代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53491592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com