- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从网站获取 JSON。当我使用 console.log()
进行打印时,一切都很好(我看到打印了所需的数据)但是通过 Intent 传递的参数没有分配给变量,稍后我将其放入 export 中,因此 Google助理告诉我信息。
我做错了什么?下面的代码是在 Dialogflow 中运行的 Google Cloud Function。
'use strict';
//This is what I say to get info out
//"Bus line 409 , bus stop nutrio bar"
const request = require('request');
let url = 'https://www.SAMPLESITE.com/Ajax/FindStationDevices?stationId=';
//Creating variables with sample data, that I'm always getting but not the real-time data from JSON.
var arriveInG = "15:15";
var delayG = "7:07";
var arriveTimeG = "13:44";
var distanceLeftG = "2.3 km";
// Import the Dialogflow module from the Actions on Google client library.
const {dialogflow} = require('actions-on-google');
// Import the firebase-functions package for deployment.
const functions = require('firebase-functions');
// Instantiate the Dialogflow client.
const app = dialogflow({debug: true});
// Handle the Dialogflow intent named 'blah-blah'.
// The intent collects a parameters named 'busline,busStop'.
app.intent('getBusTime', (conv, params) => {
const bLine = params.busline;
const bStop = params.busStop;
url+= bStop;
// These are to tell me if parameters are extracted correctly.
// conv.ask('Your lucky number is ' + bLine);
// conv.close(`You said ${num}`);
// conv.ask('Bus Stop is: ' + bStop + " ");
// conv.ask(' Bus Line is: ' + bLine);
// conv.ask(' URL is: ' + url);
request.get({
url: url,
json: true,
headers: {'User-Agent': 'request'}
},(err, res, data) => {
if (err) {
console.log('Error:', err);
} else if (res.statusCode !== 200) {
console.log('Status:', res.statusCode);
} else {
// do something here with received data
// data is already parsed as JSON:
// console.log(data.schedule[0].data[0].text);
var i;
for (i = 0; i < data.liveData.length; i++) { //
//Check if Live data is not null
if (data.liveData[i] !== null) {
//If bus line is the correct one from our question then...
if (data.liveData[i].allLines[0] == bLine) {
arriveInG = data.liveData[i].arriveIn;
arriveTimeG = data.liveData[i].arriveTime;
delayG = data.liveData[i].delay;
distanceLeftG = data.liveData[i].distanceLeft;
console.log("Bus Line number " + bLine +
" on Bus Stop " + bStop +
" will arrive in " + arriveInG);
console.log("The arrive time is " + arriveTimeG);
console.log("Distance left is " + distanceLeftG);
assingValues(arriveInG);
}
} else {
console.log("data.liveData[0] != null");
}
}
}
});
conv.ask(" Bus Line number " + bLine
+ " on Bus Stop " + bStop
+ " will arrive in " + arriveInG
+ ".The arrive time is " + arriveTimeG
+ ".Distance left is " + distanceLeftG);
});
function assingValues(arrival)
{
arriveInG = arrival;
}
// Set the DialogflowApp object to handle the HTTPS POST request.
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
在 Prisoner 的帮助下,工作代码是这样的:
'use strict';
const request = require('request');
const requestNat = require('request-promise-native');
let url = 'https://www.samplewebsite.com/Ajax/FindStationDevices?stationId=';
var arriveInG = "15:15";//sample inital values assigned.
var delayG = "7:07";//sample inital values assigned.
var arriveTimeG = "13:44";//sample inital values assigned.
var distanceLeftG = "2.3 km";//sample inital values assigned.
// Import the Dialogflow module from the Actions on Google client library.
const {dialogflow} = require('actions-on-google');
// Import the firebase-functions package for deployment.
const functions = require('firebase-functions');
// Instantiate the Dialogflow client.
const app = dialogflow({debug: true});
// Handle the Dialogflow intent named 'getBusTime'.
// The intent collects a parameter named 'busline', 'busStop'.
app.intent('getBusTime', (conv, params) => {
const bLine = params.busline;
const bStop = params.busStop;
url+= bStop;
return requestNat.get({
url: url,
json: true,
headers: {'User-Agent': 'request'}
}).then( body => {
// Process the body, which is already an object
// console.log(data.schedule[0].data[0].text);
var i;
for (i = 0; i < body.liveData.length; i++) { //
//Check if Live data is not null
if (body.liveData[i] !== null) {
//If bus line is the correct one from our qustion then...
if (body.liveData[i].allLines[0] == bLine) {
arriveInG = body.liveData[i].arriveIn;
arriveTimeG = body.liveData[i].arriveTime;
delayG = body.liveData[i].delay;
distanceLeftG = body.liveData[i].distanceLeft;
console.log("Bus Line number " + bLine +
" on Bus Stop " + bStop +
" will arrive in " + arriveInG);
console.log("The arrive time is " + arriveTimeG);
console.log("Distance left is " + distanceLeftG);
}
} else {
console.log("data.liveData[0] != null");
}
}
//Place the google assistant answer here
conv.ask(" Bus Line number " + bLine
+ " on Bus Stop " + bStop
+ " will arrive in " + arriveInG
+ ".The arrive time is " + arriveTimeG
+ ".Distance left is " + distanceLeftG);
}).catch( err => {
// Error handling
console.log('Error:', err);
});
});
// Set the DialogflowApp object to handle the HTTPS POST request.
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
// TO TEST Respond individually(put in body !!!)
// conv.ask('Your lucky number is ' + bLine);
// conv.close(`You said ${num}`);
// conv.ask('Bus Stop is: ' + bStop + " ");
// conv.ask(' Bus Line is: ' + bLine);
// conv.ask(' URL is: ' + url);
// Test Speach
// Bus line 409 , bus stop nutrio bar
// Bus line 148 , bus stop 53
最佳答案
这里有两个相关的问题。
首先,如果您正在进行异步调用,您的处理程序必须返回一个 Promise。否则库不知道异步调用何时完成,有数据,你可以发回回复。
由于您正在进行 HTTP 调用,这是一个异步请求,因此需要使用 Promise 来完成。最简单的方法是使用 request-promise-native包而不是 request
包。
所以这部分代码可能看起来像这样:
const request = require('request');
return request.get({
url: url,
json: true,
headers: {'User-Agent': 'request'}
}).then( body => {
// Process the body, which is already an object
}).catch( err => {
// Error handling
});
第二个问题是您对 conv.ask()
的调用在带有响应的回调函数之外。在上面的代码中,它应该在“处理正文”的部分。
关于javascript - 从 API 调用解析 JSON 后,从意图参数中提取的参数未分配给变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52598689/
作为后续问题:Laravel Redirect::intended() conditional fallbacks 我遇到了一个问题,在设置了预期的 URL session 后,即使用户决定不登录而是
我面临一个问题,即与任何意图不匹配的单词,它会假设它属于标记最多的话语的意图。 示例:如果 意图 A 由动物等话语组成 意图 B 包含“水果”等话语 意图 C 由诸如昆虫之类的话语组成 意图 D 由诸
拥有什么实际区别 subroutine fillName(person) type(PersonType), intent(inout) :: person person%name = "
我想知道 Dialogflow 中是否有任何商定的意图、事件和上下文的命名约定。 如果没有,那么如果您分享您自己的命名约定,我将不胜感激! 最佳答案 我发现“只要别人容易理解就行”这句话有点矛盾。如果
我正在尝试了解使用队列的用例。 我的理解:队列意味着一对一。唯一的用例(如果不是罕见的话,很少)是:消息仅供一次使用。 但即使在这些情况下,我也可能想使用主题(只是为了将来安全)。唯一需要额外注意的是
我的 Xcode 是 v10,我正在为 SiriKit 开发一个针对 iOS 12 的自定义 intent。 在 Xcode 10 中,自定义意图是在 .intentdefinition 文件中设计的
我有一个设置了 .intentdefinition 文件的 WidgetKit ,我可以在运行我的 WidgetKit 时从我的枚举中进行选择,但我不确定如何在代码中使用这些信息。 我希望能够根据用户
我需要为意图过滤器注册(在运行时)自定义 BroadcastReceiver 可以在 list 中描述为 并在用户通过按应用程序中的某个按钮退出应用程序时取消注册接收
根据 Fortran 标准: The INTENT (OUT) attribute for a nonpointer dummy argument specifies that the dummy a
我正在使用 Twitter Web Intents 来检查是否有人关注我。现在的问题是;我只在事件对象中获取我自己的屏幕名作为回调。 twttr.events.bind('follow', funct
编辑 很抱歉大家,这只是由于意图名称后面缺少逗号。非常抱歉x: 我最近使用 Microsoft Bot Framework (botbuilder v3.14.0)、Node.js (v8.9.4)
我正在开发的产品: RequeSTLy - Chrome 和 Firefox 扩展设置重定向、修改 header 、切换主机、插入用户脚本 ( https://www.requestly.in/ )
有什么方法可以有目的地合并对话框,这样我就不需要多余的代码片段? bot.dialog('whats-your-name', require('./dialogs/whats-your-name')
我是 Dialogflow 的新手,虽然它很容易理解,但我无法使用自定义事件触发 Intent。 我必须实现的任务是,当在后端 Node.js Webhook 中检测到警报时(例如:老板想要做某事),
在 Microsoft Bot Framework 中,我已经开始对话并运行一些意图,假设“登录”,但是当我向用户询问用户名或密码时,他可能会说“取消该”或“取消登录”,我如何获得此意图:“取消”以及
我使用 LUIS 框架构建了一个运行良好的机器人。在研究过程中遇到了以下几点 与 LUIS 意图连接后;机器人无法检查正则表达式意图喜欢 对于我正在尝试设置的对话框.matches('^helpdes
我想知道 URL 是发布到 facebook 的链接。在 Twitter 上,我可以使用“http://twitter.com/intent/tweet?text=”来发推文。虽然我试图寻找一个,但我
通读,http://www.w3schools.com/angular/angular_directives.asp我遇到了一个在评论中调用指令的例子,具体来说: 您可以在 http://www.w
我在 Stack Overflow 上的许多帖子中读到,可分配数组在传递到虚拟参数为 intent(out) 的子例程中时会被释放。 如果我考虑以下代码: program main real, di
API.ai 的预构建包可让您轻松获得长长的意图列表。目前,我正在尝试利用他们的 smalltalk 包,该包有大约 100 个意图,并对每个意图做出响应。 我正在使用api-ai-recognize
我是一名优秀的程序员,十分优秀!