node.jsparsingpromise和返回值

我使用Microsoft bot框架来创build一个“简单的”PoC机器人。 我用一个教程作为基础,并扩展它。

对于不同的意图(例如,问候,再见等)以及其中有更多逻辑(reqstatus)的函数,我有几个基本函数。

简单的(即greeting.js)很好地返回答案,但更复杂的答案不(reqstatus.js)。 在独立的脚本中运行reqstatus.js的主代码(没有第一个“const getReqStatus =(entity)=> {”)。

server.js (main) – >参见调用“if(intent){”…

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 – >返回stringok

 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函数,但也没有工作。 经过大量的尝试和谷歌search,我仍然卡住,想问问这里的专家。 非常感谢。

我认为问题在于你的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()作为第二个参数的匿名callback函数中 。 这不是getReqStatus函数本身的返回值,所以getReqStatus没有返回任何东西,正如所料。

正如你所说,这个函数的代码可以像独立代码那样正确地运行,只是因为它正确地设置了监听器,并且它完成了它所要做的事情。 但是,该代码在包装函数时不会返回Promise。

你需要的是返回一个包装lineReader.onclosures处理程序的Promise,如:

 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,你怎么解决它。