2015-02-21 7 views
5

Sono ancora molto nuovo su Node.js e sto cercando di capire come funzionano i callback. Così, qui è il mio problema:Come restituire un valore da una query SELECT mysql in node.js

avrei dovuto mettere più codice:

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

}) 

ho commentato ogni console.log di essere più chiaro. Ho bisogno di ottenere l'ID corretto quando i check per if (!payload.sub) in app.get()

+0

E 'la variabile '' user_id' undefined' se 'console.log (user_id)' destra dopo aver impostato nella dichiarazione 'else' o quando lo si usa per impostare' payload.sub '? –

+0

per la tua prima funzione, '' function fetchID (callback) '' dove viene passato l'oggetto '' data''? –

risposta

6

I suoi due funzioni dovrebbero essere qualcosa di simile -

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

e poi

var user_id; 

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

Qui nel callback funzione, la variabile restituita content manterrà il valore per user_id.

EDIT

non ho risolto il problema esatto come avevate descritto sopra.

Ma nel seguente esempio, ho dimostrato che, il meccanismo di callback sta lavorando -

First (creazione tabella e inserire alcuni dati fittizi) -

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

Ora ho fatto il tuo post metodo come ottenuto e testato nel browser.

In seguito è la classe piena testato nel mio 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); 

Ora queste richieste produrrà questo output - http://127.0.0.1:1212/getuser?username=john =>user id is -1 e http://127.0.0.1:1212/getuser?username=sham =>user id is -2

Spero che questo esempio di codice vi aiuterà per capire la callback in node.js.

Grazie

+0

Ho usato il tuo metodo, ma sfortunatamente non funziona. Ho aggiornato il mio primo post per ulteriori dettagli. – redAce