将 API.ai 调用封装到外部 javascript 函数中不起作用
Encapsulating API.ai call into an external javascript function is not working
这段代码工作正常:
var apiai = require('apiai');
var app = apiai(<token>);
var request = app.textRequest('jacket', {
'sessionId': 123456
});
request.on('response', function(response) {
console.log(response);
console.log(response.result.fulfillment.speech);
console.log(response.result.metadata.intentName);
});
request.on('error', function(error) {
console.log(error);
});
request.end();
它产生以下控制台输出:
{ id: '2865abde-ac8f-4ac3-816e-483c68f709d0',
timestamp: '2016-11-08T22:38:56.461Z',
result:
{ source: 'agent',
resolvedQuery: 'jacket',
action: '',
actionIncomplete: false,
parameters: {},
contexts: [ [Object] ],
metadata:
{ intentId: '357af94f-00b3-4016-a661-732419ddafd6',
webhookUsed: 'false',
intentName: 'clothing' },
fulfillment: { speech: 'clothing2', messages: [Object] },
score: 0.6 },
status: { code: 200, errorType: 'success' },
sessionId: '123456' }
clothing2
clothing
但是,当我尝试将其分解为一个函数调用时,事情并不顺利:
文件:main.js
var apiai = require('apiai');
var app3 = apiai(<token>);
exports.getresponse = function(inputstring){
var request = app3.textRequest(inputstring, {'sessionId': 123456});
request.on('response', function(response) {
return(response);
});
request.on('error', function(error) {
return(error);
});
request.end();
};
文件:moda.js
var express = require("express");
var app = express();
var joe = require('./main.js');
console.log(joe.getresponse('jacket'));
app.listen(3000);
当我运行moda.js(节点moda.js)时,我只得到
undefined
作为控制台输出。
我做错了什么?
非常感谢!
joe.getresponse()
没有明确的 return,因此它有隐含的 return undefined;
这就是您在控制台输出中看到 undefined
的原因。
原因有点复杂,也是javascript编程的基础,但它与回调和javascript的异步执行有关。
这里的这一行实际上是在添加一个匿名函数作为回调。该函数在被调用之前不会真正执行(通常是响应事件)。
request.on('response', function(response) {
return(response);
});
因此,当您 return 响应时,return 的范围不在 getresponse()
外部函数内,而是在 response
事件发射器内.
相反,您需要以可以确定地访问它的方式捕获响应值。通过向 getresponse()
方法提供您自己的回调,该回调将有权访问响应对象。
看起来像这样:
main.js
var apiai = require('apiai');
var app3 = apiai(<token>);
exports.getresponse = function(inputstring,callback){
var request = app3.textRequest(inputstring, {'sessionId': 123456});
request.on('response', function(response) {
callback(null,response);
});
request.on('error', function(error) {
callback(error,null);
});
request.end();
};
moda.js
var express = require("express");
var app = express();
var joe = require('./main.js');
joe.getresponse('jacket', function(error,response) {
if(error) { console.error(error); }
console.log(response);
});
app.listen(3000);
我调用调用者提供的回调,而不是 return 响应值,然后处理响应(调用 console.log)。
这段代码工作正常:
var apiai = require('apiai');
var app = apiai(<token>);
var request = app.textRequest('jacket', {
'sessionId': 123456
});
request.on('response', function(response) {
console.log(response);
console.log(response.result.fulfillment.speech);
console.log(response.result.metadata.intentName);
});
request.on('error', function(error) {
console.log(error);
});
request.end();
它产生以下控制台输出:
{ id: '2865abde-ac8f-4ac3-816e-483c68f709d0',
timestamp: '2016-11-08T22:38:56.461Z',
result:
{ source: 'agent',
resolvedQuery: 'jacket',
action: '',
actionIncomplete: false,
parameters: {},
contexts: [ [Object] ],
metadata:
{ intentId: '357af94f-00b3-4016-a661-732419ddafd6',
webhookUsed: 'false',
intentName: 'clothing' },
fulfillment: { speech: 'clothing2', messages: [Object] },
score: 0.6 },
status: { code: 200, errorType: 'success' },
sessionId: '123456' }
clothing2
clothing
但是,当我尝试将其分解为一个函数调用时,事情并不顺利:
文件:main.js
var apiai = require('apiai');
var app3 = apiai(<token>);
exports.getresponse = function(inputstring){
var request = app3.textRequest(inputstring, {'sessionId': 123456});
request.on('response', function(response) {
return(response);
});
request.on('error', function(error) {
return(error);
});
request.end();
};
文件:moda.js
var express = require("express");
var app = express();
var joe = require('./main.js');
console.log(joe.getresponse('jacket'));
app.listen(3000);
当我运行moda.js(节点moda.js)时,我只得到
undefined
作为控制台输出。
我做错了什么?
非常感谢!
joe.getresponse()
没有明确的 return,因此它有隐含的 return undefined;
这就是您在控制台输出中看到 undefined
的原因。
原因有点复杂,也是javascript编程的基础,但它与回调和javascript的异步执行有关。
这里的这一行实际上是在添加一个匿名函数作为回调。该函数在被调用之前不会真正执行(通常是响应事件)。
request.on('response', function(response) {
return(response);
});
因此,当您 return 响应时,return 的范围不在 getresponse()
外部函数内,而是在 response
事件发射器内.
相反,您需要以可以确定地访问它的方式捕获响应值。通过向 getresponse()
方法提供您自己的回调,该回调将有权访问响应对象。
看起来像这样:
main.js
var apiai = require('apiai');
var app3 = apiai(<token>);
exports.getresponse = function(inputstring,callback){
var request = app3.textRequest(inputstring, {'sessionId': 123456});
request.on('response', function(response) {
callback(null,response);
});
request.on('error', function(error) {
callback(error,null);
});
request.end();
};
moda.js
var express = require("express");
var app = express();
var joe = require('./main.js');
joe.getresponse('jacket', function(error,response) {
if(error) { console.error(error); }
console.log(response);
});
app.listen(3000);
我调用调用者提供的回调,而不是 return 响应值,然后处理响应(调用 console.log)。