Search code examples
javascriptsessionsails.jssails-mongo

req.session.flash = { } not working sails.js


I'm really new at sails.js and at the moment I'm using sails 1.0 . I've got the problem when I try to validate my signup page that the once the form is invalid the error message is shown above the form as expected but when I do the refresh it is still there. Beside that everything is okay.

Routing is done manually and I think the problem is here req.session.flash = {}; in api/controllers/UsersController.js which is not being empty object !!

api/controllers/UsersControllers.js

module.exports = {

    signup:function(req,res,next){
        res.locals.flash = _.clone(req.session.flash);
        res.view('pages/signup');
        req.session.flash = {};
    },

    create:function(req,res,next){
        var values = req.allParams();
        Users.create(values).exec(function(err,user){
            // if there's an error
            if(err){
                console.log(err);
                req.session.flash = { 
                    err: err 
                }

            // if error redirect back to signup page
            return res.redirect('/users/signup');
            }

            //  After successfully creating the user
            // redirect to the show action

            res.view('pages/create');
            req.session.flash = {};
        });
    }
};

view/pages/signup.ejs

<div class="container">

    <% if(flash) { %>
      <ul class="alert alert-success">
        <% Object.keys(flash.err).forEach(function(error){ %>
          <li> <%- JSON.stringify(flash.err[error]) %> </li>
        <% }) %>
      </ul>
    <% } %>

  <div class="row login-pannel">
    <div class="col-md-4 col-md-offset-4">
      <div class="panel panel-default">
        <div class="panel-heading login-pannel-heading">
          <h3 class="panel-title"> User Signup </h3>
        </div>
        <div class="panel-body login-pannel-body">

          <form class="login-form" method="post" action="/users/create">

            <div class="form-group">
              <label for="loginUsername">Name</label>
              <input type="text" class="form-control" id="name" name="name" placeholder="Your Name" autofocus>
            </div>

            <div class="form-group">
              <label for="loginUsername">Email address</label>
              <input type="email" class="form-control" id="loginEmail" name="email" aria-describedby="emailHelp" placeholder="Your Email">
              <small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
            </div>

            <div class="form-group">
              <label for="loginPassword">Password</label>
              <input type="password" class="form-control" id="pass" name="password" placeholder="Password">
              <label class="text-danger" id="signup-pass"></label>
            </div>

            <div class="form-group">
              <label for="loginPassword">Confirm Password</label>
              <input type="password" class="form-control" id="con-pass" name="conPassword" placeholder="Confirm Password">
              <label class="text-danger" id="signup-con-pass"></label>
            </div>

            <button type="submit" class="btn btn-primary">Submit</button>
            <button type="reset" class="btn btn-danger reset-button">Reset</button>
            <input type='hidden' name='_csrf' value='<%= _csrf %>'>
          </form>

        </div>
      </div>
    </div>
  </div>
</div>

Solution

  • If my memory does not betray me, you must make any changes to your session object before sending the response. In your api/controllers/UsersControllers.js try to swap these two lines:

    res.view('pages/create');
    req.session.flash = {};
    

    It should be:

    req.session.flash = {};
    res.view('pages/create');
    

    Read more about sessions here. The most important thing there:

    The property will not be stored in the session store nor available to other requests until the response is sent.