2017-01-03 7 views
4

私はMicrosoftボットフレームワークを使って、「シンプルな」PoCボットを作り上げました。私はtutorialを基礎として使用し、それを拡張しました。node.js約束と戻り値を解決する

私はdifferetインテント(greetings、goodbyeなど)のための基本的な機能とそれにいくつかのより多くのロジック(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を関数に入れようとしましたが、それも機能しませんでした。 たくさんの試して、グーグルーグした後、私はまだ固執しており、ここでは専門家に尋ねたいと思っていました。ありがとうございます。

答えて

3

あなたのgetReqStatusが本当に何も返さないという問題があると思います。あなたの例ではgetGreetings関数は、実際にはその関数の戻り値としてPromise.resolve(answers)を返しています。しかし、あなたのgetReqStatus機能で、あなただけのcloseイベントlineReaderリスナーを設定

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); 
}); 

あなたが約束を返しているあなたは二通りlineReader.on()に渡している匿名のコールバック関数内を解決しましたパラメータ。これはgetReqStatus関数自体の戻り値ではないため、getReqStatusは期待どおり何も返されません。

この関数のコードは、リスナーを正しく設定し、実行する必要があるため、スタンドアロンコードとして正しく実行されます。しかし、そのコードは関数にラップされたときに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); 
     }); 
    }); 
} 

:ようにあなたが必要となる何

は、lineReader.on近いハンドラをラップ約束を返すことですマイクロソフトのBotフレームワークには何らかの経験があり、readlineモジュールではまったく使用されていません。しかし、これで問題が解決しない場合でも、なぜあなたの関数がプロミスを返さないのかを少し理解して、それをどうやって解決できるのかを理解することを願っています。

+1

'return resolve(出力);'は解決(出力)のみである必要があります。 –

+0

@Sergeonはあなたの早い返信にとても感謝しています。 Unfortunetlyそれは動作しません...また、Jaromandaからの提案された調整X – DPM

+0

それは今うまく動作します。主な問題は、メインスクリプトが渡さなければならなかった変数が正常ではないということでした。あなたのsupprotのために多くのありがとう。 – DPM

関連する問題