2012-03-28 241 views
0

我是NodeJS(Duh!)的新手。 我知道它執行異步的功能,但我仍然無法看到是什麼原因導致了這種現象:NodeJS mysql查詢返回空結果

我使用express和mysql模塊,並試圖根據請求參數執行SQL查詢。它應該是一個簡單的驗證API功能,其中服務器將通過監聽特定的URL來查詢兩個請求參數(用戶和密碼),從而在數據庫中查找用戶。

問題是,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], // ... 

編輯:其他一些問題與您的代碼:

  • 您不必解析網址。 Express爲你做這件事,並且查詢是可利用的爲req.query
  • 您不應該在異步代碼中使用throw。它會帶來意想不到的結果。相反,請堅持傳遞(err, results)到所有回調的nodejs範例,並在可能的地方進行適當的錯誤檢查 - 即在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], // ...