我使用Microsoft Bot框架提出了一个“简单的” PoC Bot.我以tutorial为基础进行扩展.
我有一些针对差异意图的基本功能(例如,问候语,再见等),其中一个具有更多逻辑(reqstatus).
简单的(即greeting.js)可以很好地返回答案,而复杂的则不能(reqstatus.js).在独立脚本中运行reqstatus.js的主要代码(不带第一个“ const getReqStatus =(entity)=> {”).
server.js(主)->参见“如果(意图){”中的调用…
const getFeelings = require('./intents/feelings.js')
const getGoodbyes = require('./intents/goodbyes.js')
const getGreetings = require('./intents/greetings.js')
const getHelp = require('./intents/help.js')
const getReqStatus = require('./intents/reqstatus.js')
...
const bot = new builder.UniversalBot(connector)
// Intents based on deFinitions on recast
const INTENTS = {
feelings: getFeelings,
goodbyes: getGoodbyes,
greetings: getGreetings,
help: getHelp,
reqstatus: getReqStatus,
}
// Event when Message received
bot.dialog('/', (session) => {
recastClient.textRequest(session.message.text)
.then(res => {
const intent = res.intent()
const entity = res.get('request_number')
console.log(`UserName: ${session.message.user.name}`)
console.log(`Msg: ${session.message.text}`)
console.log(`Intent: ${intent.slug}`)
if (intent) {
INTENTS[intent.slug](entity)
.then(res => session.send(res))
.catch(err => session.send(err))
}
})
.catch(() => session.send('Sorry I didn\'t get that. '))
})
...
greetings.js->返回字符串ok
const getGreetings = () => {
const answers = ['Hi, my name is SuperBot. Nice to meet you!', ]
return Promise.resolve((answers))
}
module.exports = getGreetings
reqstatus.js->不返回任何东西
const getReqStatus = (entity) => {
var request = require('request');
var request_number = entity.toLowerCase()
var output = [];
// Processing
var lineReader = require('readline').createInterface({
input: fs.createReadStream('netreqs.csv')
});
lineReader.on('line', function (line) {
var jsonFromLine = {};
var linesplit = line.split(';');
jsonFromLine.req = linesplit[0];
jsonFromLine.req_count = linesplit[1];
jsonFromLine.req_type = linesplit[2];
//...
var req_lowever = jsonFromLine.req.toLowerCase()
if (req_lowever == request_number) {
output.push( `Your request ${jsonFromLine.req} was received`);
// simplified
}
});
// Output
lineReader.on('close', function (line) {
if (output == '') {
output.push( `I was not able to find a request like ${request_number}.`);
}
console.log(output); // list output
return Promise.resolve(output);
});
}
module.exports = getReqStatus
我还尝试将getReqStatus放在函数中,但这也没有用.
经过大量的尝试和谷歌搜索,我仍然陷于困境,并想问这里的专家.非常感谢.
解决方法:
我认为问题在于您的getReqStatus并未真正返回任何内容.在示例getGreetings函数中,您实际上是在返回Promise.resolve(answers)作为该函数的返回值.
但是,在您的getReqStatus函数中,您只需设置一个监听器lineReader close事件:
lineReader.on('close', function (line) {
if (output == '') {
output.push( `I was not able to find a request like ${request_number}.`);
}
console.log(output); // list output
return Promise.resolve(output);
});
您将在匿名回调函数内部返回一个已解决的Promise,该函数将作为第二个参数传递给lineReader.on().那不是getReqStatus函数本身的返回值,因此getReqStatus不会按预期返回任何内容.
正如您所说,该函数的代码可以作为独立代码正常运行,只是因为它正确设置了侦听器并执行了它必须要做的事情.但是,当包装在函数中时,该代码不会返回Promise.
您需要返回一个Promise,该Promise在close处理程序上包装lineReader.,例如:
function getReqStatus(){
//...code
return new Promise( function(resolve , reject ){
lineReader.on('close', function (line) {
if (output == '') {
output.push( `I was not able to find a request like ${request_number}.`);
}
console.log(output); // list output
return resolve(output);
});
});
}
我之所以这样说是因为我真的不知道这段代码是否可以工作,我对Microsoft Bot框架没有任何经验,也没有与readline模块一起使用.但是,即使这不能解决您的问题,我希望它可以帮助您稍微理解为什么您的函数不返回Promise以及如何解决它.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。