2012-03-28 2 views
0

저는 NodeJS (duh!)를 처음 사용합니다. 비동기 함수를 실행하지만이 현상을 일으키는 원인을 확인할 수 없습니다.NodeJS mysql 쿼리가 빈 결과를 반환합니다.

express 및 mysql 모듈을 사용하고 요청 매개 변수를 기반으로 SQL 쿼리를 실행하려고합니다. 서버가 두 개의 요청 매개 변수 (user 및 passwd)에 대한 특정 URL에서 수신하여 데이터베이스에서 사용자를 조회하는 간단한 유효성 검증 API 기능으로되어 있습니다.

문제는 입니다. 쿼리에서 요청 매개 변수를 사용하면 SQL 쿼리가 항상 빈 개체를 결과로 반환합니다.

그러나 하드 코드를 쿼리하고 app.get (...) 외부에서 실행하면 원하는 결과가 나타납니다!하지만이 요청에 의해 필요에 따라 작업해야 ...

내가 뭘 잘못

(내가 GET 요청을 나중에 사용하려는 아니에요,이 예 목적 : 디버깅을위한) 이리?

여기 내 코드입니다 :

// Server and Mysql setup here 
var app = require('express').createServer(), 
    SERVER_PORT = 8080; 
var Client = require('mysql').Client, 
    client = new Client(), 
    ... 
// User, password and database setup here, cropped out from this example // 
// ... 

function validateUser(user, passwd, callback) { 
client.query('SELECT date FROM '+CUSTOMERS_TABLE+' WHERE email="'+user+'" AND passwd="'+passwd+'";', 
    function selectCb(err, results, fields) { 
     if (err) { 
      throw err; 
     } 
     console.log(fields); 
     callback(results); 
    }); 
} 

app.get('/', function(req, res){ 
var url_parts = url.parse(req.url, true); 
var query = url_parts.query; 
if((typeof query[REQ_PARAM_USER] != 'undefined' && typeof query[REQ_PARAM_PASSWD] != 'undefined') 
     && (query[REQ_PARAM_USER] != '' && query[REQ_PARAM_PASSWD] != '')) { 
     validateUser(REQ_PARAM_USER, REQ_PARAM_PASSWD, function(results) { 
      console.log(results); 
     }); 
    } 
    res.end("End") 
}); 
app.listen(SERVER_PORT); 

console.log('Server running at port '+SERVER_PORT); 

아, 그리고 그건 그렇고, CONSOLE.LOG (필드) 올바른 필드를 출력! 그러나 왜 결과가 아닌가?

답변

2

당신은 validateUser에 잘못된 매개 변수를 전달하는 :

validateUser(REQ_PARAM_USER, REQ_PARAM_PASSWD, // ... 

은 당신이 정말로 원하는 무엇 :

validateUser(query[REQ_PARAM_USER], query[REQ_PARAM_PASSWD], // ... 

편집 : 코드와 몇 가지 다른 문제 :

  • 당신은 URL을 구문 분석 할 필요가 없습니다. Express가이 작업을 수행하며 쿼리는 req.query으로 사용할 수 있습니다.
  • throw을 비동기 코드로 사용하지 마십시오. 그것은 예기치 않은 결과를 줄 것입니다. 대신 (err, results)을 모든 콜백에 전달하는 노드의 패러다임을 고수하고 가능한 경우에 verifyUser에서 오류를 확인하고 callback과 함께 오류를 전달하고 get 처리기에서 오류를 확인합니다. 오류가 발생하면 res.send(500) (또는 무엇인가)을 입력하거나 next(err)을 호출하여 오류 처리기로 전달하십시오.

    validateUser(query[REQ_PARAM_USER], query[REQ_PARAM_PASSWD], function(err, results) { 
        if(err) { 
         console.error(err); 
         res.send(500); 
        } else { 
         console.log(results); 
         res.send(results); 
        } 
    }); 
    
  • SQL 쿼리와 같은 쿼리 매개 변수를 직접 전달하지 마십시오. 대신, SQL 쿼리에 대한 매개 변수를 사용

    client.query('SELECT date FROM '+CUSTOMERS_TABLE+' WHERE email=? AND passwd=?', [user, passwd], // ... 
    
관련 문제