Bonjour à tous !
Je viens vous demander de l'aide quant à la conception de mon projet nodejs. Je suis nouveau dans le monde de la programmation web et je découvre tout juste nodejs.
Je suis en train de coder une api web mais je rencontre un problème que je ne sais pas résoudre :/ ... Pour l'instant mon api est vraiment simple. J'ai une route getRequest à laquelle on donne un token. La première tâche que je souhaite faire est vérifier ce token.
Voici mes fichier pour que vous compreniez un peu mieux :
app.js
1 2 3 4 5 6 7 8 9 10 11 12 13
|
var getRequest = require('./getRequest');
var argumentChecker = require('./argumentChecker')
var express = require('express');
var app = express();
app.get('/getRequest', [getRequest.checkGetRequest, getRequest.getRequestError, getRequest.getRequest]);
app.use(function(req, res) {
res.status(404).send('Not found');
});
app.listen(4242); |
Ici pour la route /getRequest j'utilise 3 middleware, checkGetRequest qui vérifie le fond et la forme de la requete, getRequestError en cas d'erreur et enfin getRequest pour répondre à la requete.
getRequest.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
var argumentChecker = require('./argumentChecker');
var constantes = require('./constantes');
module.exports = {
// Permet de valider le fond et la forme de la requete
checkGetRequest: function(req, res, next) {
req.apiError = argumentChecker.checkApiToken(req, res);
next();
},
// En cas d'erreur on renvoie une réponse d'erreur ici, sinon on passe à travers
getRequestError: function(req, res, next) {
console.log('res : ' + req.apiError);
if (req.apiError === constantes.noError())
next();
res.json('{ "status": "error", "reason": "' + req.apiError + '" }');
},
// Permet de répondre à la requete
getRequest: function(req, res, next) {
res.json('{ "status": "success", "author": "alexis", "age": 42 }');
}
}; |
Mon problème commence ici, dans checkGetRequest j'appelle la fonction argumentChecker.checkApiToken pour valider mon token ... J'ai créée une fonction à part car je vais sans doute réutiliser cette fonctionnalité dans d'autres cas. Cette fonction est censé me renvoyer un code d'erreur si le token n'est pas bon.
Voici le fichier où se trouve cette fonction : argumentChecker.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
var constantes = require('./constantes');
var bdd = require('./bdd').bdd;
module.exports = {
// Permet de vérifier la forme et l'existance du token
checkApiToken: function(token) {
if (token === undefined || token === "")
return (constantes.tokenIsMissing());
bdd.getConnection(function(err, connection) {
if (err)
console.log(err);
connection.query('SELECT api_state FROM api_infos WHERE api_token = ' + bdd.escape(token),
function(err, rows, fields) {
if (err)
console.log(err);
if (fields < 1)
return(constantes.tokenIsUnknown());
if (rows[0].api_state == 0)
return (constantes.tokenIsDesactivated());
});
connection.release(); // <-------------- le faire à chaque fois qu'on fait un if qui return !
});
return (constantes.noError());
}
}; |
C'est la le coeur du problème .... Je commence par faire une vérification de base, savoir si le token existe et si il n'est pas vide. Ensuite je veux vérifier que ce token est bien en base de données, pour ca j'utilise une connection à ma base de données mysql grace a bdd.getConnection. Je rentre donc dans un callback ... Ensuite j'exécute ma requete, je récupère ma réponse dans une second callback ... Avec les éléments de réponse je fais mes tests. Evidement si ce n'est pas bon je fais un return, et ca marche pas. Je comprend que ca ne marche pas, un callback n'est pas censé faire de return. Mais je ne sais pas comment m'y prendre autrement
! Avec vous une idée ?
Merci !
EDIT:
J'ai essayé une autre approche, utiliser la fonction checkApiToken comme un middleware, pour ca je l'ai changer comme suit :
oldcheckApiToken: function(req, res, next)
et dans app.js j'ai changer cette ligne :
app.get('/getRequest', [argumentChecker.checkApiToken, getRequest.getRequestError, getRequest.getRequest]);
Dans les conditions if de checkApiToken j'ai fais quelque chose comme ça :
1 2 3 4 5
|
if (field< 1) {
req.apiError = constantes.tokenIsUnknown();
next();
} |
Mais ça ne fonctionne toujours pas, chose étrange car je pensais que ça réglerai mon problème !
Partager