2015-02-21 14 views
5

Nadal jestem bardzo nowy dla Node.js i próbuję zrozumieć, jak działają wywołania zwrotne. Tak, tu jest mój problem:Jak zwrócić wartość z zapytania SELECT mysql w pliku node.js

powinny położyć większy mam kod:

POST:

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 
}) 

GET:

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 !' 
     }); 
    } 

}) 

I komentuje każdą console.log być bardziej jasne. Potrzebuję uzyskać prawidłowy identyfikator kiedy sprawdzić if (!payload.sub) w app.get()

+0

Czy 'user_id' zmienna' undefined' jeśli 'console.log (user_id)' tuż po ustawieniu go w 'else' rachunku lub gdy używasz go ustawić' payload.sub '? –

+0

dla twojej pierwszej funkcji, '' function fetchID (callback) '' gdzie jest obiekt '' data'' jest przekazywany? –

Odpowiedz

6

Twoje dwie funkcje powinny być coś podobnego -

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); 
     }); 
} 

a następnie

var user_id; 

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

tu w zwrotnego funkcja, zwrócona zmienna content zachowa wartość dla user_id.

EDIT

ja nie rozwiązało problemu, jak dokładnie opisała powyżej.

Ale w poniższym przykładzie I wykazały, że mechanizm callback działa -

Pierwsze (tworzenie tabeli i wstawić jakieś dane fikcyjne) -

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"); 

Teraz zrobiłem swój post metoda jak pobrać i przetestować w przeglądarce.

Poniżej znajduje się pełna klasa przetestowany w moim localhost -

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); 

Teraz wnioski te będą produkować tego wyjścia - http://127.0.0.1:1212/getuser?username=john =>user id is -1 i http://127.0.0.1:1212/getuser?username=sham =>user id is -2

nadzieję, że ten przykładowy kod pomoże aby zrozumieć wywołanie zwrotne w node.js.

Dzięki

+0

Użyłem twojej metody, ale niestety to nie działa. Zaktualizowałem swój pierwszy post, aby uzyskać więcej szczegółów. – redAce

Powiązane problemy