1

I'm using NodeJS, express, and passport. However I think this question is just about javascript. In my routes file, I have

app.get(  '/users', login_req, user.index);

so when the server receives a get request at /users, it will pass req, res, next through the login_req function, and login_req will call the user.index function if a user is authorized. I'm wondering if and how I can add more arguments to login_req? My goal is to be able to pass in additional args like login_req(['admin'],['user1', 'user2']) to be able to select which users have access to user.index.

Here is my login_req code:

exports.login_req = function(req, res, next) {
  if (req.isAuthenticated()) { return next(); }
  res.redirect('/login')
}

I guess, in general, I'm wondering how to attach more arguments to a callback.

aynber
  • 22,380
  • 8
  • 50
  • 63
az_
  • 1,493
  • 1
  • 16
  • 24
  • 1
    Your syntax is a little off. `login_req({'admin'}, {'user1', 'user2'});` would be closer to what you need. – Lee Taylor Jan 08 '13 at 23:34
  • Sounds like you need a callback. – elclanrs Jan 08 '13 at 23:35
  • Actually, what? Why would the syntax be like that? {}'s are used for objects like `person={firstname:"John",lastname:"Doe",age:50,eyecolor:"blue"};`, so how would that make sense? I changed the original question to have arrays instead. – az_ Jan 09 '13 at 00:57

2 Answers2

2

The above answer should work, however I was looking for a more organized solution. Using what I learned from the above answer, I came up with the following.

I learned from jQuery pass more parameters into callback on how to add more parameters into a callback. Here is my code:

exports.login_req = function(groups, users) {
  return function(req, res, next) {
    console.log(groups, users)
    if (req.isAuthenticated()) { return next(); }
    res.redirect('/login')
  };
}

and

app.get(  '/users', login_req("group1"), user.index);

The callback to login_req passes groups = "group1" and users = undefined. login_req returns the anonymous function with args req, res, next and groups, users, available by closure. I've printed out groups and users for proof of concept, and it seems to work.

I preferred this method, since now I can have my routes.js file organized like so:

app.get(  '/users',          login_req("admins"),     user.index);
app.get(  '/users/new',                               user.new);
app.post( '/users',                                   user.create);
app.get(  '/users/:id',                               user.show);
app.get(  '/users/:id/edit', login_req("admins", "user1"), user.edit);
app.put(  '/users/:id',      login_req("admins", "user1"), user.update);
app.del(  '/users/:id',      login_req("admins", "user1"), user.destroy);
Community
  • 1
  • 1
az_
  • 1,493
  • 1
  • 16
  • 24
1

Pass an anonymous function to get and call login_req from within that:

app.get('/users', function (req, res, next) {
    login_req(req, res, next, something, somethingElse);
}, user.index);
James Allardice
  • 164,175
  • 21
  • 332
  • 312
  • I'd ideally like something more clean, since I have more than 20 of these app.get, app.post, etc. lines. I used http://stackoverflow.com/questions/939032/jquery-pass-more-parameters-into-callback to find a solution, which I will post below. – az_ Jan 08 '13 at 23:55