node.js로 mysql에서 select하고 난 다음 가져온 데이터를 쓰고싶어요ㅜㅜ

조회수 5565회
var results=[];  //결과 담아올 빈 배열
connection.query('SELECT * from img_result_tb', function(err, rows, fields) {
if (!err){
    for(var i=0; i<6;i++){
        results.push(rows[i].resultId); //resultId에 해당하는 부분만 가져옴
    }
    console.log('The solution is: ', results);  //정상출력됨
}
else
    console.log('Error while performing Query.', err);
});

쿼리문 callback함수에서 results라는 배열에 원하는 정보를 담았는데 저 배열을 함수 밖에서 써지지가 않아요. 숫자를 담아 와서 javascript로 각 숫자에 해당하는 색깔을 표현하려고 합니다. 가져온 results배열을 어떻게 하면 밖에서 쓸 수 있을까요??

ps. 지금 저 코드가 index.js라는 파일 안에 썼는데, index.js안에서 document.write같은 거를 쓰면 document가 정의 되있지 않다고 합니다. 왜그런걸까요 ㅜ ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 생각을 해보세요...

    node 는 브라우져가 아닌 서버측에서 동작해요.

    document 는 클라이언트측. 즉 브라우져내에서 존재할 수 있어요.

    node 에서 사용하는 javascript 와 html 내에서 사용하는 javascript 는 문법은 같을 순 있어도 목적하는 바가 달라요.

    node 는 서버측. 질문자가 말하는 javascript 로 DOM 을 다루는 것은 클라이언트측.

    혼동하지 마세요.

  • 위 답변은 PS에 대한 것이고 원래 질문에 대해서 답을 좀 찾아보자면... 이건 자바스크립트의 비동기성(asyncronicity) 문제로 보입니다.

    위의 모든 예제에서 정의된 함수들은 비동기 콜백이라고 부르는 함수입니다. 그게 뭐냐면 생성은 되는데 즉시 실행은 되지 않는다는 거에요. 함수는 setTimeout으로 잡으면 이벤트 대기열에 들어가고, AJAX 콜백에서는 그 콜이 일어나야 실행되고, onload에서는 DOM이 준비돼야 실행이 됩니다. 출처

    따라서 대략 이렇게 하셔야 할 것 같습니다. 테스트는 안해보았으니 한번 시도해 보세요.

    // 미리 싹다 정의를 해놓음
    var results=[];
    // results 변수의 범위(scope) 문제도 해결됨.
    var pushResults = function (rows) {
        // 5개만 가져오려면 i<6 하시면 되긴 하는데 전체를 다 가져오려면 이렇게 할 수 있습니다.
        for (var i=0; i<results.length; i++) {
            results.push(rows[i].resultId);
        }
    }
    
    // 필요할 때만 콜함
    connection.query('SELECT * from img_result_tb', function (err, rows, fields) {
    if (!err) {
        pushResults(results);
        console.log('The solution is: ', results);
    } else {
        console.log('Error while performing Query. ', err);
    }});
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)