私は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を取得する必要があります
あなたの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;
}
});
このコールバック関数では、返された変数content
がuser_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のコールバックを理解するのに役立つことを願っています。
ありがとう