对在koa2使用ejs的一些疑问
发布于 6 年前 作者 hezhongfeng 6405 次浏览 来自 问答

借鉴N-club这个项目做用户登录,原作使用koa1,我是用的koa2 刚开始访问登录界面 直接返回登录界面

yield this.render('signin');

在登陆页面,想在ejs中显示登陆错误的信息,正确就不显示了,因为要跳转了 下面的意思是当用户验证错误的话,就输出这个信息,返回这个界面

this.flash = {error: '用户名或密码错误!'};
return this.redirect('back');

下面是ejs里面的

    <% if ($this.flash && $this.flash.error) { %>
      <div class="flash">
        <div class="ui red message"><i class="close icon"></i><%= $this.flash.error %></div>
      </div>
    <% } %>

我的疑问是,为什么我在第一次get的时候不能返回正常的html 后来找到原因是因为ejs里面的这段代码 我很奇怪,为什么原作的可以正常解析返回html,我的就不行~

4 回复

啊啊啊~

发现问题所在市怎么把flash传到ejs里面,一直没有成功 有人说这样的 res.locals.flash = req.flash();就可以在ejs里面用flash了 但是ctx.res已经没有locals这个值了~

我所用过的所有框架中, redirect重定向就是完全重定向, 不会接受你在重定向前传的任何值, 本来redirect重定向的http返回码就是302,规定不会转发任何东西,比如header中的token之类的也都会被忽略, 你应该直接渲染back这个页面,而不是重定向过去

@Smallpath 应该是可以的,下面是原作对表单提交的处理,逻辑还是很清晰的,待我找到正确的方法吧~

exports.post = function* () {
  var data = this.request.body;

  var userInfo = yield $User.getUserByName(data.name);
  if (!userInfo || (userInfo.password !== data.password)) {
    this.flash = {error: '用户名或密码错误!'};
    return this.redirect('back');
  }

  this.session.user = {
    name: userInfo.name,
    email: userInfo.email
  };

  this.flash = {success: '登录成功!'};
  this.redirect('/user/' + userInfo.name);
};
回到顶部