web-dev-qa-db-ja.com

node.jsのmysql SELECTクエリから値を返す方法

私はNode.jsをまだ使い慣れていないので、コールバックの仕組みを理解しようとしています。だから、ここに私の問題があります:

私はもっ​​とコードを入れるべきだった:

役職 :

_app.post('/register', function(req, res) {

    //get data from the request
    var data = {
        username: req.body.username,
        email: req.body.email,
        password: req.body.password
    };

    function fetchID(callback) {
        connection.query('SELECT id_user FROM USERS WHERE username = ?', data.username, function(err, rows) {
            if (err) {
                callback(err, null);
            } else 
                callback(null, rows[0].id_user);
        });
    }
    var user_id;
    fetchID(function(err, content) {
        if (err) {
            console.log(err);
            return next("Mysql error, check your query");
        } else {
            user_id = content;
            console.log(user_id); //undefined
        }
    });

    console.log(user_id); //undefined
    var payload = {
        iss: req.hostname,
        sub: user_id
    }
    console.log(payload.sub); //correct id
})
_

取得する :

_app.get('/todos', function(req, res) {
    if (!req.headers.authorization) {
        return res.status(401).send({
            message: 'You are not authorized !'
        });
    }

    var token = req.headers.authorization.split(' ')[1];
    var payload = jwt.decode(token, "shhh..");

    //additional level of security
    console.log('sub id is : ' + payload.sub); //undefined
    if (!payload.sub) {
        return res.status(401).send({
            message: 'Authentication failed !'
        });
    }

})
_

より明確にするために、各console.logにコメントしました。 app.get()でif (!payload.sub)を確認するときに正しいIDを取得する必要があります

6
redAce

あなたの2つの関数は次のようなものでなければなりません-

function fetchID(data, callback) {
        connection.query('SELECT id_user FROM USERS WHERE username = ?', data.username, function(err, rows) {
            if (err) {
                callback(err, null);
            } else 
                callback(null, rows[0].id_user);
        });
}

その後

var user_id;

fetchID(data, function(err, content) {
    if (err) {
        console.log(err);
        // Do something with your error...
    } else {
        user_id = content;
    }
});

このコールバック関数では、返された変数contentuser_idの値を保持します。

[〜#〜]編集[〜#〜]

あなたが上で述べたように私は正確な問題を解決していません。

しかし、次の例では、コールバックメカニズムが機能していることを示しました-

最初(テーブルの作成といくつかのダミーデータの挿入)-

use test;
create table users (id int(11) primary key,username varchar(100));
insert into users values(1, "John");
insert into users values(2, "Sham");

今私はあなたの投稿メソッドをブラウザで取得してテストするようにしました。

以下は私のローカルホストでテストされた完全なクラスです-

var application_root = __dirname,
    express = require("express"),
    mysql = require('mysql');
var app = express();
var connection = mysql.createConnection({
  Host : 'localhost',
  user : 'root',
  password : 'admin',
  database: "test"
});
app.get('/getuser', function(req, res) {
  //get data from the request
    var data = {
        username: req.query.username
    };
    function fetchID(data, callback) {
        connection.query('SELECT id FROM users WHERE username = ?',        
               data.username, function(err, rows) {
            if (err) {
                callback(err, null);
            } else 
                callback(null, rows[0].id);
        });
    }
    var user_id;
    fetchID(data, function(err, content) {
        if (err) {
        console.log(err);
        res.send(err);  
        // Do something with your error...
        } else {
        user_id = content;
        console.log(user_id);
        res.send("user id is -" + user_id);
        }
    });
})
app.listen(1212);

これらのリクエストはこの出力を生成します-http://127.0.0.1:1212/getuser?username=john => user id is -1およびhttp://127.0.0.1:1212/getuser?username=sham => user id is -2

このコード例がnode.jsのコールバックを理解するのに役立つことを願っています。

ありがとう

7
Piyas De