Skip to content

Instantly share code, notes, and snippets.

@tj
Last active January 3, 2016 15:49
Show Gist options
  • Select an option

  • Save tj/8485653 to your computer and use it in GitHub Desktop.

Select an option

Save tj/8485653 to your computer and use it in GitHub Desktop.
/**
* POST to create a new user.
*/
exports.create = function *(){
var body = yield parse(this);
// password
var pass = body.password;
assert(pass, 400, 'password is required');
delete body.password;
let {salt, hash} = yield password(pass);
body.password_salt = salt;
body.password_hash = hash;
// validate
users.schema.validate(body);
// see if the user exists
var exists = yield users.findOne({ username: body.username }, 'name');
assert(!exists, 400, 'username is taken');
// save
yield users.insert(body);
this.status = 201;
};
@tj

tj commented Jan 18, 2014

Copy link
Copy Markdown
Author

this could of course be moved to a lib and you could do yield db.users.create(body);

  var creds = auth(this);
  assert(creds, 400, 'credentials required');

  var user = yield db.users.findOne({ username: creds.name });
  var hash = yield password(creds.pass, user.password_salt);
  assert(hash == user.password_hash, 401);

<3

@Acconut

Acconut commented Jan 18, 2014

Copy link
Copy Markdown

I think I should learn to use generators... <3

@polotek

polotek commented Jan 18, 2014

Copy link
Copy Markdown

Does this pattern have any solution for managing multiple calls in parallel. E.g. the equivalent of Q.all with promises?

@Swatinem

Copy link
Copy Markdown

That would just be yield [a, b, c] in co i quess.

@jeffmo

jeffmo commented Jan 19, 2014

Copy link
Copy Markdown

What would idiomatic client code using this generator look like?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment