레이블이 node.js인 게시물을 표시합니다. 모든 게시물 표시
레이블이 node.js인 게시물을 표시합니다. 모든 게시물 표시

2015년 12월 18일 금요일

자바스크립트 정렬코드 (2)

정렬코드를 위해 간단한 함수를 만들어 보았다.

stage_dt =[{stage:2, score:30},{stage:4, score:90},{stage:7, score:45}]
라고 한다면,

1. stage에 원하는 스테이지 값을 넣으면, 그 스테이지의 값을 리턴해준다.
2. stage값이 배열에 없다면, -로 넣어주어야 할 장소를 리턴한다.
3. stage값이 배열에 없고, 배열의 제일 처음에 넣어야 한다면 -1000을 리턴한다.
4. stage값이 배열에 없고, 배열의 제일 끝에 넣어야 한다면 -2000을 리턴한다.

string함수 중 하나인 splice를 써서 배열에 값을 추가해 주었다.

예제 소스는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
var stage_dt =[{stage:2, score:30},{stage:4, score:90},{stage:7, score:45}]
var stage = 4;
var temp_u = {};
temp_u.stage = stage;
temp_u.score = 11;
var position = find_top_score(stage, stage_dt);
if(position < 0){
    if(position == -1000){
        stage_dt.splice(0,0, temp_u);
    }else if(position == -2000){
        stage_dt.splice(stage_dt.length,0, temp_u);
    }else{
        position = position*(-1);
        stage_dt.splice(position,0, temp_u);
    }
}else{
    stage_dt[position].score = temp_u.score;
}
function find_top_score(stage, stage_dt){
    
    var position = 0;
    var m_p_f = 0;
    
    var stages_size = stage_dt.length;
    
    if(stage >= stages_size){
        position = stages_size-1;
    }else{
        position = stage -1;
    }
    
    do{
        value = stage - stage_dt[position].stage;
        if(value == 0){
            return position;
        }else if(value < 0){
            if(position == 0){
                return -1000;
            }else if(m_p_f == 1){
                return ((position+1)*(-1));
            }else{
                position --;
                m_p_f = -1;
            }
        }else{
            if(position == stages_size-1){
                return -2000;
            }else if(m_p_f == -1 ){
                return (-1*(position+1));
            }else{
                position ++;
                m_p_f = 1;
            }
        }
    }while(true);
}
cs

2015년 11월 24일 화요일

몽고DB - mongoose 사용법[ 쿼리생성 ]

케이스가 1일때는 google_id에 대해 검색하고 싶고
2일때는 apple_id에 대해 검색하고 싶다면 아래와 같이
쿼리를 생성할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var query;
switch (status) {
case 1:
    query = Data_id.findOne({ google_id : connect_id });
    break;
case 2:
    query = Data_id.findOne({ apple_id : connect_id });
    break;       
}
query.exec(function(err, dt){
    if(err){
        console.log("err : ", err);
    }
});
 
cs

몽고DB - Mongoose 사용법[ find와 findOne의 차이 ]

model폴더 밑에 notice.js- notice schema를 작성했다는 가정하에

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var mongoose = require('mongoose');
var bcrypt   = require('bcrypt-nodejs');
var Schema   = mongoose.Schema;
var validator = require('validator');
var noticeSchema = Schema({
        txt     : String,
        link    : String,
        to_t    : Number,
        del     : Number,
        nation  : String,
        v       : { type: Numberdefault0 }
    },{
        versionKey: false
});
mongoose.model('notice', noticeSchema);
 
cs

findOne을 사용시에는

1
2
3
4
5
6
7
8
9
10
11
12
require('../models/notices');
var notice = mongoose.model('notice');
notice.findOne({txt:"hello"}, function(err, notice_dt){
        if (err){            
            res.send(err);
        }else {
            if( notice_dt == null){
                ;
            }
        }
});
 
cs

db에서 자료을 찾았을 때
정보가 없는지를 아는 방법은 7번줄 처럼
notice_dt == null
을 사용합니다.

find를 사용시에는

1
2
3
4
5
6
7
8
9
10
11
12
13
14
require('../models/notices');
var notice = mongoose.model('notice');
notice.find({txt:"hello"}, function(err, notice_dt){
        if (err){            
            res.send(err);
        }else {
            if( notice_dt.length == 0){
                ;
            }else{
                console.log("notice text : ", notice_dt[0].txt);
            }
        }
});
 
cs

정보가 없는지를 아는 방법은 7번줄 처럼
 notice_dt.length == 0
를 사용합니다.
왜냐하면, notice_dt의 값이 배열로 넘어오기 때문입니다.

2015년 10월 22일 목요일

윈도우에서 node.js 사용하기

node js를 다운로드하여 설치해 줍니다.

node js 다운로드

express프레임워크를 사용할 것이므로
express를 설치해줍니다.

npm install express -g

express로 프로젝트를 만들기 위해 express-generator를 설치해줍니다.

npm install express-generator -g

express 프로젝트명으로 프로젝트를 생성할 수 있습니다.
express nodetest 라는 프로젝트를 생성해 보았습니다.
자동으로 만들어지는 것이 보일겁니다.





2015년 10월 21일 수요일

[JavaScript]배열의 요소 삭제

배열의 중간 부분의 요소를 삭제하려면
splice메소드를 사용하면 된다.

요소의 넘버는 0부터가 시작인것을 주의하자


var array = [0,1,2,3,4,5,6];
array.splice(4,1);

// array의 5번째 요소가 삭제된다.
[0,1,2,3,5,6]


2015년 10월 14일 수요일

몽고DB - mongoose 사용법[ 다수 데이타저장 ]

다수의 데이타를 한번에 저장하려면

coupon이라는 스키마가 존재한다고 가정했을때

save_coupon = [];

// 저장할 다수의 데이타 생성
for(var i = 0; i < 10; i++){
    new_coupon = {}; // new_coupon = new coupon; 은 에러가 발생한다.
    new_coupon.item = item;
    new_coupon.qty = qty;
    new_coupon.del = 0;
    save_coupon[i] = new_coupon;
}

coupon.collection.insert(save_coupon, function(err, cp_dt){
    if(err){
        return;
    }else{
    }
});

다수의 데이타 저장을 위해
coupon.collection.insert
을 사용한다.

데이타 생성시 {}로 오브젝트를 생성해야지 - new_coupon = {};
몽고디비 스키마를 이용해 만들면 - new_coupon = new coupon;

range error maximum call stack size exceeded
에러가 발생한다.

2015년 9월 28일 월요일

POST를 이용한 JSON송신

form의 post방식을 이용하여 json을 송신하는 소스이다.
서버쪽 코드는 아래와 같다.

router.post('/sameple_test', function  (req, res) {
    var data = req.body.data;
    console.log("data : " + data);
    var json = JSON.stringify(eval("(" + data + ")"));
    var d = JSON.parse(json);
   
    console.log("data.node : " + d.node);
    res.end();
});

sameple_test라는 주소로 보내게 되며, json변환을 위해
data 파라미터로 받아온 값은 json형이 아닌 string형이기 때문에
JSON.parse()전, json string형의 변환이 필요하여,
JSON.stringify(eval("(" + data + ")"))을 사용하였다.


클라이언트에서 보내는 json 문자열이다.




서버에 표시되는 화면이다.



2015년 9월 21일 월요일

자바스크립 정렬코드

자바스크립 정렬코드

 splice를 이용하여 .n순으로 정렬하고 n값이 같다면, s값이 큰값을 넣는다.

    var data_score = [];
    var s = "";
    var l = 0;
//기본 데이타 배열 만들기
    for(var i = 0; i < 10; i++){
        var unit = new Object;
        l += 2;
       
        unit.s = l;
        unit.n = l;
   
        data_score[i] = unit;
// 기본데이타 출력
        var str = "stage : " + data_score[i].n + ".. score : " + data_score[i].s;
       
        console.log(str);
    }
    console.log("-------------------------");
 
// 삽입할 데이타 만들기
    var unit_score = new Object;
    unit_score.n = 7;
    unit_score.s = 100;

// 데이타 삽입하기   
    var j = data_score.length;
    if(j == 0){
        data_score[j] = unit_score;
        j++;
    }else{
        for(var k = 1; k <= j; k++){
            if( data_score[j-k].n - unit_score.n > 0){
                if(k == j){
                    data_score.splice(0,0, unit_score);
                }     
            }else if(unit_score.n - data_score[j-k].n == 0){
                if(unit_score.s > data_score[j-k].s){
                    data_score[j-k].s = unit_score.s;
                   
                    break;
                }
            }else{
                data_score.splice(j-k+1,0, unit_score);
                break;
            }
        }
   
    }
//삽입되어진 결과물 출력   
    for(var i = 0; i < data_score.length; i++){
        var str = "stage : " + data_score[i].n + ".. score : " + data_score[i].s;
       
        console.log(str);
       
    }



2015년 9월 4일 금요일

Redis 설정과 랭킹처리(node.js)

redis용 npm 모듈을 설치한다.

  npm install redis


레디스 서버와 연결한다.

var redis = require('redis');
var client = redis.createClient("6379", "192.192.0.0");
client.on('connect', function() {
    //console.log('connected');
});

redis.createClient("6379", "192.192.0.0")
레디스 포트는 설정을 바꾸지 않는한,  "6379"번을 사용한다.
redis.createClient("포트", "레디스서버 IP")
이다.


점수를 추가한다

var board = "leaderboard";
var score = 13;
var id = "blaknwhite";
client.zadd(board, score, id, function(err, reply){
    if(err){
        console.log("error");
        return;
    }else{
        console.log("ranking : " + reply);
    }
});

client.zadd(board, score, id, function(err, reply)
board는 키값이다. 이 키값으로 랭킹그룹을 구분한다.
예를 들어 12번 스테이지의 랭킹그룹과 13번 스테이지의 랭킹그룹을 가지고 싶다면 키값을
"stage12"와 "stage13"으로 설정하여 그룹을 나눌 수 있다.
score는 점수를 넣는다.
id에는 유저id를 넣는다.
function(err, reply)는 콜백 함수로서, 에러가 발생하면 err에 값이 있게 되고, 정상적일때는 reply에 rank값이 들어있다.
이때의 rank는  작은값을 0으로 sort 했을때(오름차순)의 값이다.

예를 들어 id(score) 가
  black1(10) ---- 0
  black2(22) ---- 1
  black3(34) ---- 2
라면 black1의 rank는 0,black3는 2 가 된다.

만약 내림차순으로 얻으려면( black3의 랭킹이 0)

client.zrevrank( board, save_data_id, function(err, reply){
});

을 사용한다.

두개의 command를 동시에 실행한다

만약 점수를 추가하면서 zrevrank의 값을 얻어 오려면, 두개의 command를 동시에 실행하는
multi를 사용하면 된다.

var multis = client.multi();
multis.zadd( board, score, id);
multis.zrevrank( board, id);
multis.exec(function(err, re){
    if(err){
        console.log("error");
        return;
    }else{
        console.log("ranking : " + re[1]);
    }
});

콜백함수의 re에는 값이 배열 형식으로 들어가 있다
 re[0] -> zadd의 return값
 re[1] -> zrevrank의 return값


랭킹리스트를 가져온다

내림차순으로 0등부터 2등까지를 점수와 함께 가져오고 싶다면

var board = "leaderboard";
var start= 0;
var end = 2;
client.ZREVRANGE(board, start, end, 'WITHSCORES', function(err, reply){
    if(err){
        console.log("error");
        return;
    }else{
        var count = reply.length;
        var j =0;
        for(var i=0; i < count; i+=2 ){
            console.log("ID : "  + reply[i]);
            console.log("Score : "  + reply[i+1]);
        }
    }
});

예를 들어 id(score) 가
  black1(34) ---- 0
  black2(22) ---- 1
  black3(17) ---- 2
  black4(11) ---- 3
일때
 
client.ZREVRANGE(board, start, end, function(err, reply) 라면
reply[0] -> black1
reply[1] -> black2
reply[2] -> black3
이 된다.

점수도 같이 표시되는
client.ZREVRANGE(board, start, end, 'WITHSCORES', function(err, reply) 라면
reply[0] -> black1
reply[1] -> 34
reply[2] -> black2
reply[3] -> 22
reply[4] -> black3
reply[1] -> 17
이 된다.