반응형

기존에 mysql을 이용한 채팅사이트를 만든적이 있었다. 이번엔 엘라스틱서치를 이용해보자.

 

먼저 elasticsearch 모듈을 설치한다.

 

npm install elasticsearch

 

그리고 엘라스틱서치에 인덱스를 하나 만든다. 

 

curl -u elasticid:******** -XPUT 'localhost:9200/chat?pretty' -H 'Content-Type: application/json' -d '{ "mappings": { "properties": { "regdate": { "type": " keyword"}, "room": { "type": "keyword"}, "uname": { "type": "keyword" }, "msg": { "type": "keyword"} , "ip": { "type": "keyword" } } } }'

 

인덱스는 꼭 이렇게 안해도 된다. 본인이 원하는 스타일대로 해주면 되겠다.

 

그리고 소켓용 파일을 만든다. 

 

socket.js

 

var http = require('http');
var fs = require('fs');
var socketio = require('socket.io');

const elasticsearch = require("elasticsearch");
const client = new elasticsearch.Client({
  hosts: ["http://elasticid:elasticpassword@localhost:9200"]
});

async function msgwrite(room, uname, msg) {
const time = Date.now();
var eid=time+Math.floor(Math.random() * 1000000);
  try {
    const rs =  await client.create({
index: 'chat',
id: eid,
body: {"room": room, "uname":uname, "msg":msg, "regdate":time}
    });
    console.log(rs);
  } catch (err) {
    console.error(err);
  }
}

var server = http.createServer(function(req, res){
        fs.readFile('chat.html', 'utf8', function(err, data){
        res.writeHead(200, {'Content-Type':'text/html'});
        res.end(data);
    });
}).listen(8888, function(){
    console.log('Running ~~~~~~~~~~~~');
});

var io = socketio(server);
var chat=io.sockets.on('connection', function(socket){
        socket.on('sMsg', function(data){
        console.log(data);
var room = data.room;
msgwrite(room, data.name, data.msg);
socket.join(room);
        chat.to(room).emit('rMsg', data);
    });
});

 

채팅용 파일은 chat.html이고 포트는 8888이다. 이부분은 각자에 환경에 맞춰 지정하면 된다. 

 

chat.html

 

<!DOCTYPE>
<html>
<head>
<style>
        #container {
            width: 400px;
     border: 1px dotted #000;
     padding: 10px;
     height: 328px;
        }

        #chatBox {

            border: 1px solid #000;

     width: 400px;

     height: 300px;

            margin-bottom: 5px;

        }

        #chat li {

            padding: 5px 0px;

        }

        #name {

     width: 78px;

        }

        #msg {

     width: 256px;

        }



    </style>

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.7.2/socket.io.min.js"></script>

<script type="text/javascript">

function getParameterByName(name) {
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(location.search);
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}


window.onload = function(){
var socket = io.connect();
var room = getParameterByName('room');
            if(socket != null && socket != undefined){
                var welcome = document.createElement('li');
                welcome.innerHTML = '<system> Start Chatting';
                document.getElementById('chat').appendChild(welcome);
                socket.on('rMsg', function(data){
                    var li = document.createElement('li');
                    li.innerHTML = data.name + ' : ' + data.msg;
                    document.getElementById('chat').appendChild(li);
                });

                document.getElementById('submit').onclick = function(){
                    var val = document.getElementById('msg').value;
                    var name = document.getElementById('name').value;
                    socket.emit('sMsg', {
                        name : name,
msg : val,
room : room
                    });
                    document.getElementById('msg').value = '';
                };

            }

        };

    </script>

</head>

<body>

<div id="container">
    <div id="chatBox">
        <ul id="chat"></ul>
    </div>
    <input type="text" id="name"/>
    <input type="text" id="msg"/>
    <button id="submit">Chat</button>

</div>
</body>
</html>

 

이 정도 소스는 node를 모른다해도 html만 알아도 할 수 있는 수준이기때문에 설명은 생략한다.

 

테스트 해보자. 우선 서버에서 노드로 소켓을 실행해준다.

 

node socket.js

 

이렇게 해도 되고 socket이 죽는건 싫으니까

 

pm2 start socke.js

 

이렇게 해준다.

 

그리고 브라우저에서 

 

localhost:8888/chat.html?room=test1

 

이렇게 호출하면 된다.

 

이렇게해서 채팅을 하게 되면 대화방 별로 대화내용을 엘라스틱서치에 저장할 수 있다. 

반응형

+ Recent posts