2017-04-18 3 views
0

나는 nodejs와 자바 스크립트에 아직 익숙하지 않은데, 내 질문에 매우 단순한 것처럼 보이지만 많은 어려움을 겪고 있고 그물에서 답을 찾을 수없는 것 같아서 미안하다.모듈 내보내기가있는 객체 전달하기

기본적으로 스크립트 (sqlRequest.js)를 호출하고이를 호출하는 동안 정수를 전송합니다. 이 스크립트는 내 데이터베이스에 SQL 요청을 보내고 결과 (객체)를 원본 파일로 반환합니다. + essai : 나는 그을 console.log ("INDEX"를 볼 수있는 콘솔에서

exports.sendSQL = function(id) {  
var mysql= require('mysql'); 
    var connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : 'bcombes', 
    password : 'bertrand1994', 
    database : 'totalkpi' 
    }); 
    connection.connect(); 
    var sql ="SELECT * FROM tra_ticket where id=?"; 
    var insert=[id]; 
    sql=mysql.format(sql, insert); 

    connection.query(sql, function(err, rows, fields) { 
     if (err) { 
      console.log('Error while performing Query.'); 
      connection.end(); 
     } 
     else { 
      connection.end(); 
      console.log(rows); 
      return rows; 
     } 
    });}; 

:

router.post('/request', function(req, res, next){ 
var id = req.body.id; 
var essai = require('./sqlRequest.js'); 

console.log("INDEX: "+essai.sendSQL(id)); }); 

그리고 이제 sqlRequest.js 코드 :

다음은 코드입니다. sendSQL (id)); 정의되지 않은 것으로 보이며 console.log (행) 앞에 표시됩니다.

서버가 함수가 끝나고 어쨌든 변수를 표시 할 때까지 기다리지 않을 수 있습니까?

어쨌든 시간을내어 도와 주셔서 감사합니다.

+0

당신이 콜백이 필요합니다, 그래서 당신은 DB에 대한 비동기 호출을 트리거됩니다 함수 결과를 기다리는 함수 – siva

답변

0

파일간에 변수를 전달하는 논리가 좋습니다. essai.sendSQL(id)undefined으로 표시되는 이유는 connection.query(...)이 비동기 적으로 호출되고 질문에서 언급했듯이 console.log이 실행되어 DB 쿼리가 완료되기 전에 발생합니다.

당신은 그냥 약간의 코드를 리팩토링 필요가있는 문제를 해결하려면 : sqlRequest.js에서 다음

var essai = require('./sqlRequest.js'); 

router.post('/request', function(req, res, next){ 
    var id = req.body.id; 
    // send callback to sendSQL 
    essai.sendSQL(id, function(index) { 
     // this will only fire once the callback has been called 
     console.log("INDEX: " + index) 
    }) 
}); 

그리고 :

exports.sendSQL = function (id, cb) { 
    var mysql = require('mysql'); 
    var connection = mysql.createConnection({ 
     host: 'localhost', 
     user: 'bcombes', 
     password: 'bertrand1994', 
     database: 'totalkpi' 
    }); 
    connection.connect(); 
    var sql = "SELECT * FROM tra_ticket where id=?"; 
    var insert = [id]; 
    sql = mysql.format(sql, insert); 

    connection.query(sql, function (err, rows, fields) { 
     if (err) { 
      console.log('Error while performing Query.'); 
      connection.end(); 
     } 
     else { 
      connection.end(); 
      console.log(rows); 
      // call the callback 
      cb(rows); 
     } 
    }); 
}; 
+0

고맙습니다. 완벽하게 작동하지만 동 기적으로 호출하는 방법이 있습니까? 왜 비동기식입니까? 특별한 이유가 있습니까? 어쨌든 고마워요 :) – Exo

+0

@Exo 아무 문제 없어! :) Node.js가 단일 스레드이기 때문에 비동기식입니다. DB 요청과 같은 작업의 경우 DB 응답을 기다리는 동안 전체 응용 프로그램이 다른 작업을하지 못하도록 차단하는 것이 일반적입니다. 즉, 동기식 DB 요청을하는 방법이 있습니다. http://stackoverflow.com/q/32850045/4774345에 대한 답변을 살펴보십시오. – dan