기존에 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
이렇게 호출하면 된다.
이렇게해서 채팅을 하게 되면 대화방 별로 대화내용을 엘라스틱서치에 저장할 수 있다.
'nodejs' 카테고리의 다른 글
TXID 조회 (0) | 2019.05.20 |
---|---|
Centos7에 node와 express 설치하기 (0) | 2019.05.16 |
node를 이용해 kafka 서버에 메세지 등록하고 메세지 읽기 (2) | 2019.03.26 |
node와 web3를 이용한 이더 전송과 트랜잭션 확인 (0) | 2019.03.15 |
node와 web3를 이용해 블럭넘버와 계정 조회하기 (0) | 2019.03.15 |