javascript - Node.js Passport Login Race Condition -
i believe dealing race condition on node.js authentication using passportjs (specifically passport-local).
here router registration:
router.post('/', upload.single('avatar'), function(req, res, next) { var usertype = req.body.usertype; var username = req.body.username; var password = req.body.password; var email = req.body.email; // convert buffer data base64 encoded string var base64avatar = new buffer(req.file.buffer).tostring('base64'); var avatar = 'data:' + req.file.mimetype + ';base64,' + base64avatar; var createduser; if (usertype == 'viewer') { createduser = new user.user(username, password, email, [], [], avatar).getinstance(); } else if (usertype == 'contributor') { createduser = new contributor.contributor(username, password, email, [], [], avatar, []).getinstance(); } req.login(createduser, function(err) { if (err) { return next(err); } req.session.save(function() { res.redirect('/user/' + req.user.username); }); }); }); in constructor of user model using typescript:
constructor(private _username: string, private _password: string, private\ _email: string, private _favorites: array<any>, private _inbox: array<any>, \ private _avatar: string) { this._modelinstance = new usermodel({username: _username, password: _\ password, email: _email, favorites: _favorites, inbox: _inbox, avatar: _avata\ r}); this._modelinstance.save(); }; i've tried applying async.series to:
a) the model instance creation , save in user class constructor.
b) the createduser creation in route , req.login request.
i've tried (as can see) save session manually , use redirect callback ensure session saved. i've looked buffer , seems synchronous don't believe issue.
if call user model short string such myavatar login user in properly. when avatar string gets large. in case, user can login after automatic login not performed through req.login.
it telling user profile gets redirected isn't shown right after login, signalling trying login before model being saved (the profile page makes database query , isn't finding yet). refresh after redirect shows data on profile page, however.
am overlooking asynchronous issue somewhere?
i fixed moving save() logic registration router.
then add req.login call save() callback:
createduser.save(function(err, data) { if (err) { console.log(err); } else { req.login(createduser, function(err) { if (err) { return next(err); } req.session.save(function() { res.redirect('/user/' + req.user.username); }); }); } });
Comments
Post a Comment