0

私は NodeJS を初めて使用します (duh!)。関数が非同期で実行されることはわかっていますが、この現象の原因はまだわかりません。

Express モジュールと mysql モジュールを使用しており、リクエスト パラメータに基づいて SQL クエリを実行しようとしています。これは、サーバーが特定の URL で 2 つの要求パラメーター (user と passwd) をリッスンすることにより、データベース内のユーザーを検索する単純な検証 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(fields) は正しいフィールドを出力します! しかし、なぜ結果が出ないのでしょうか?

4

1 に答える 1

2

に間違ったパラメータを渡していますvalidateUser:

validateUser(REQ_PARAM_USER, REQ_PARAM_PASSWD, // ...

本当に欲しいもの:

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

編集:コードに関する他のいくつかの問題:

  • URL を解析する必要はありません。Express がこれを行います。クエリは として利用できますreq.query
  • throw非同期コードでは使用しないでください。それは予期しない結果をもたらします。代わりに、すべてのコールバックに渡すという nodejs パラダイムに固執し、(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], // ...
    
于 2012-03-28T10:55:48.813 に答える