ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ChatBot 만들기 - 2) textQuery route와 eventQuery route만들기
    NODE.JS 2021. 5. 15. 09:25

     

    클라이언트가 뭔가를 입력해서 server에 알리면 서버는 그것을 dialogflowAPI에게 보내고 이를 처리해서 다시 서버에 보낸다.

    그리고 서버는 다시 클라이언트에게 반응을 보내준다.

     

    여기서 client랑 소통하는 route는 2개인데, 

    클라이언트의 입력이 있는 경우에는 text query route가 실행되고, 

    입력이 없는 경우에는 event query router가 실행되어 "무엇을 도와드릴까요?"와 같은 문장을 실행한다. (대화 초기)

    순서

    먼저 dependency를 다운받기 위해서 npm install 을 하자. 

    client 폴더에 가서도 npm install을 해준다.

     

     

    우선 server의 index.js에 가서 다음의 문장을 넣어준다.

    app.use('/api/dialogflow', require('./server/routes/dialogflow'));
    

     

     

    routes폴더 안에 dialogflow.js파일을 만들어주고 그 다음 두개의 route를 만들어 준다. 

    우선 dialogflow를 어떻게 사용하는지는 다음의 사이트에서 확인할 수 있다 .

    https://www.npmjs.com/package/dialogflow

     

    dialogflow

    Dialogflow API client for Node.js

    www.npmjs.com

     

    text route부터 만들어준다.

     

    const express = require('express');
    const router = express.Router();
    const structjson = require('./structjson.js');
    const dialogflow = require('dialogflow');
    const uuid = require('uuid');
    
    const config = require('../config/keys');
    
    const projectId = config.googleProjectID
    const sessionId = config.dialogFlowSessionID
    const languageCode = config.dialogFlowSessionLanguageCode
    
    
    // Create a new session
    const sessionClient = new dialogflow.SessionsClient();
    const sessionPath = sessionClient.sessionPath(projectId, sessionId);
    
    // We will make two routes 
    
    
    // Text Query Route
    //await 은 async
    router.post('/textQuery', async (req, res) => {
        //We need to send some information that comes from the client to Dialogflow API 
        
        // The text query request.
        const request = {
            session: sessionPath,
            queryInput: {
                text: {
                    // The query to send to the dialogflow agent 입력되는 것에 따라서 나와야 한다. (bodyparser이용해서 body이용한다.)
                    text: req.body.text,
                    // The language used by the client (en-US) 모드에 따라서 정의되어 있는 것으로 가져온다.
                    languageCode: languageCode,
                },
            },
        };
    
        // Send request and log result 여기서 responses들이 우리가 클라이언트한테 보여줘야 하는 것을 뜻한다. 
        const responses = await sessionClient.detectIntent(request);
        console.log('Detected intent');
        const result = responses[0].queryResult;
        console.log(`  Query: ${result.queryText}`);
        console.log(`  Response: ${result.fulfillmentText}`);
    
        res.send(result)//프론트엔드에게 결과를 보내준다.
    })

     

     

    우리는 아직 클라이언트가 없기 때문에 postman을 이용해서 등록해볼 것이다. 

    포스트맨에서 입력하면
    결과를 보내준다.

     

     

    event query도 만들어보자.

    
    //Event Query Route
    
    router.post('/eventQuery', async (req, res) => {
        //We need to send some information that comes from the client to Dialogflow API 
        // The text query request.
        const request = {
            session: sessionPath,
            queryInput: {
                event: {//여기서 text가 아닌 event를 보낸다.(text를 입력하지 않아서 없다)
                    // The query to send to the dialogflow agent
                    name: req.body.event,
                    // The language used by the client (en-US)
                    languageCode: languageCode,
                },
            },
        };
    
        // Send request and log result
        const responses = await sessionClient.detectIntent(request);
        console.log('Detected intent');
        const result = responses[0].queryResult;
        console.log(`  Query: ${result.queryText}`);
        console.log(`  Response: ${result.fulfillmentText}`);
    
        res.send(result)
    })
    
    
    
    

     

    똑같이 포스트맨을 이용해서 해보자. 

     

    우리가 메세지를 보내기 전에 먼저 실행이 되어야 할 것이다 .

     

    여기서 우리가 dialogflow에 가서 이벤트 설정을 해주어야한다. 

    intent 만들기
    add event -> welcome
    response 설정
    intent 네임 설정 후 저장

     

    포스트맨에서 event 네임을 그대로 입력해주면, 

     

    콘솔창에 반응이 뜬 것을 확인할 수 있다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

Designed by Tistory.