I'm using bluebird for promises in my Node/Express application and wrote an API call in which the user passes in a JSON Web Token that contains their user
information, and then I decode the token
, and pull up the events that user should see based off their userId
.
If anyone could give me advice on how I can clean this code up while also using the proper promise practices, that would be great.
/routes.js
app.post('/api/events/', require('./views/api/index').events);
/views/api/index.js
var B_Promise = require('bluebird');
var jwt = require('jsonwebtoken');
exports.events = function(req, res) {
var results = {};
var errors = [];
var validateEmptyFields = function() {
return new B_Promise(function(resolve, reject) {
var token = req.body.token || req.param('token') || req.headers['x-access-token'];
if (!token) {
return reject('Please provide the token parameter');
}
resolve(token);
});
};
var getUser = function(token) {
return new B_Promise(function(resolve, reject) {
jwt.verify(token, req.app.config.api.secret, function(err, decoded) {
if (err) {
return reject(err);
}
resolve(decoded);
});
});
};
var getEvents = function(user) {
return new B_Promise(function(resolve, reject) {
req.app.db.getConnection(function(err, connection){
if (err) {
return reject(err);
}
/* jshint multistr: true */
connection.query('SELECT e.* FROM events e \
INNER JOIN event_to_groups etg ON e.id=etg.event_id \
INNER JOIN user_to_groups utg ON utg.group_id=etg.group_id \
WHERE utg.user_id=?', user.id, function(err, events) {
if (err) {
return reject(err);
}
results.events = events;
resolve();
});
connection.release();
});
});
};
validateEmptyFields()
.then(getUser)
.then(getEvents)
.catch(function(err) {
errors.push(err);
})
.finally(function() {
res.json({results: results, errors: errors});
});
};