금호동머장
42
2021-01-18 13:22:10
5
218

nodejs로 서버 실행 전에 DB에서 읽은 값을 활용하고싶습니다


안녕하세요

현재 개인적으로 cctv 관제할수있는 오픈소스를 활용해서

간단한 웹서버를 만들어보고있는데 nodejs에 문외한이라 질문 드립니다..ㅠㅠ


오픈소스가 하드코딩되어있는 문제가 있는 상태입니다.

/**
 * Created by Andrew D.Laptev<a.d.laptev@gmail.com> on 30.03.15.
 */

const app = require('express')()
    , server = require('http').Server(app)
    , io = require('socket.io')(server)
    , rtsp = require('../lib/rtsp-ffmpeg')
    ;
// use rtsp = require('rtsp-ffmpeg') instead if you have install the package
server.listen(6147function(){
    console.log('Listening on localhost:6147');
});


var cams = [
        'rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov'
        , 'rtsp://freja.hiof.no:1935/rtplive/definst/hessdalen03.stream'
        , 'udp://localhost:1234'
    ].map(function(urii) {
        var stream = new rtsp.FFMpeg({input: uriresolution: '320x240'quality: 3});
        stream.on('start'function() {
            console.log('stream ' + i + ' started');
        });
        stream.on('stop'function() {
            console.log('stream ' + i + ' stopped');
        });
        return stream;
    });

cams.forEach(function(camStreami) {
    var ns = io.of('/cam' + i);
    ns.on('connection'function(wsocket) {
        console.log('connected to /cam' + i);
        var pipeStream = function(data) {
            wsocket.emit('data'data);
        };
        camStream.on('data'pipeStream);

        wsocket.on('disconnect'function() {
            console.log('disconnected from /cam' + i);
            camStream.removeListener('data'pipeStream);
        });
    });
});

io.on('connection'function(socket) {
    socket.emit('start'cams.length);
});

app.get('/'function (reqres) {
    res.sendFile(__dirname + '/index.html');
});

위 코드의 동작은

var cams = [ ~~~~~~~~ ]


cams 배열안에있는 cctv 주소 목록들을 읽어서 실시간 스트리밍 오픈소스를 거쳐,

server.listen()을 통해 실행이 됩니다.


근데 저 var cams 안 배열에 적힌 cctv 연결 주소들은 하드코딩이되어있고,

저는 웹페이지에서 자유롭게 새로운 cctv 주소를 추가하면 cams 배열에 insert되게 하고 싶은 상황이에요..

그래서 유동적인 cctv 목록 추가를 위해 DB에 cctv 목록들을 저장해놓고

임시로 html 페이지에 박스 안에 cctv 주소를 입력하여 버튼을 누르면 DB에 저장되게끔 구현을 해 놓은 상황입니다.


DB에 저장된 cctv 목록들을 읽어온 후, cams 배열에 insert 한 후

서버를 실행되게 하고싶으나 자바의 비동기성때문에 cams = [ ] 가 텅 비어있는 상태로 서버가 열리게 되더라구요..


DB에 connection해서 

conn.query( sql문 ~) 으로 정보를 읽어와도

전역변수로 선언된 var cams = ''에 insert 하려해도 비동기성때문에 텅빈 상태로 서버가 열립니다.

도움 주시면 정말 감사하겠습니다 ..

0
  • 답변 5

  • 박종복
    677
    2021-01-18 13:33:06

    아래처럼 하면 될것 같네요.

    server.listen(6147, function(){
        console.log('Listening on localhost:6147');
        ...
        conn.query(sql, function(){
           var cams = [...];
           cams.forEach(....);
        });
    
    });
    
    


  • 노드전도사
    369
    2021-01-18 13:50:09

    비동기성이 문제라면 동기성으로 작업하면 될거 같습니다.

    캠 데이터 수집 -> 웹 서비스 오픈 -> 소켓 서비스 오픈순으로 작업을 진행하다가

    도중에 오류가 발생하면 이후 작업은 중단하는 방식으로 구현하면 될듯합니다.

    ...
    const async = require("async");
    
    let cams = {};
    
    function asyncCamsListGet(result_callback) {
    	const query = '쿼리문';
    	conn.query(query, function(err, result) {
    		if(err) {
    			console.error(`에러처리, ${err}`);
    			return_callback(err, false);
    		} else {
    			result_callback(result, true);
    		}
    	});
    });
    
    async.series([
    		function (callback) {
    			asyncCamsListGet(function(result, state) {
    				if (state == true) {
    					cams.forEach ...
    					callback(null);
    				} else (state == false)
    					callback(err);
    			});
    		}, function (callback) {
    			service.listen ... {
    				callback(null);
    			};
    		}, function (callback) {
    			io.on ... {
    				callback(null);
    			}
    		}
    	], function (err) {
    		if (err) {
    			console.error(err);
    		} else
    			console.log("service Success");
    	}
    );


    이게 정답은 아니긴한데.. 저는 일단 이런 매커니즘으로 사용중입니다.

  • 금호동머장
    42
    2021-01-18 17:42:04 작성 2021-01-18 17:45:33 수정됨

    선생님들 모두 답변 감사드립니다.


    하지만 둘다 잘 되지 않았네요..


    서버구동은 되고 코드에 문제는 없어보이나


    websocket쪽에서 데이터가 통신이 안이루어지는거같아요..

    영상 이미지를 못받아옵니다 ㅠㅠ

  • 노드전도사
    369
    2021-01-19 11:02:59

    소켓이 문제라면 서버에서 상시 대기 상태로 열어두면 어떨까요?

    io.on('connection', function(socket) {
    	socket.on("client-from-data", function(data) { //소켓 상시 대기
    		console.log("데이터 수신 및 작업..");
    		const dataSend = "1234";
    		socket.emit("client-to-data", {data: dataSand});
    	});
    });


    이러면 웹 서버가 재실행되도 대기 상태로 돌아가면 "client-from-data" 타입으로 전달된 소켓 데이터는 상시 수신이 가능해집니다.

  • 금호동머장
    42
    2021-01-19 17:47:37 작성 2021-01-19 17:47:46 수정됨

    음.. 노드전도사선생님 말씀대로

    socket.on 안에다 socket.emit을 묶어봤는데


    데이터 수신 작업 << 이 텍스트로 출력 안되는걸 보니

    저기로 진입 자체를 못하는것 같습니다.. 다시한번 감사드립니다 ㅎㅎ

  • 로그인을 하시면 답변을 등록할 수 있습니다.