2017-01-03 2 views
4

"간단한"PoC 봇을 만들기 위해 Microsoft bot 프레임 워크를 사용합니다. 나는 tutorial을 기초로 사용하고 그것을 확장했다.node.js 약속 및 반환 값을 확인하십시오.

나는 differet 의도 (greetings, goodbye 등)를위한 몇 가지 기본적인 기능을 가지고 있으며, 하나의 로직에 대해서는 몇 가지 더 있습니다 (reqstatus).

단순한 응답 (예 : greeting.js)은 응답을 멋지게 반환하지만 더 복잡한 응답 (reqstatus.js)은 응답을 반환하지 않습니다. 독립적 인 스크립트에서 첫 번째 "const getReqStatus = (entity) => {")없이 reqstatus.js의 주 코드를 실행하면 작동합니다.

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은 -> 확인 캐릭터 라인을 돌려줍니다

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)을 반환합니다.

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 기능에, 당신은 단지 리스너 lineReader close 이벤트를 설정 매개 변수. 이는 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 가까운 핸들러를 감싸는 약속을 반환하는 것입니다 Microsoft Bot 프레임 워크와 관련된 모든 종류의 경험이 있으며 readline 모듈에는 전혀 사용되지 않습니다. 그러나이 방법으로 문제가 해결되지 않더라도 기능이 약속을 반환하지 않는 이유와 해결 방법을 이해하는 데 도움이되기를 바랍니다.

+1

'return resolve (output);은 (resolve) 만 필요합니다. –

+0

@Sergeon은 빠른 답장을 보내 주셔서 감사합니다. Unfortunetly 그것도 작동하지 않습니다 ... 또한 Jaromanda X에서 제안 된 조정 X – DPM

+0

그것은 잘 작동합니다.주요 문제는 내 메인 스크립트가 전달해야하는 변수가 좋지 않다는 것입니다. 너의 supprot을 위해 고마워한다. – DPM