CNode

对在koa2使用ejs的一些疑问

问答
Hhezhongfeng发布于10 年前最后回复10 年前4 回复7335 浏览0 收藏

借鉴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)

H
hezhongfeng#1·10 年前

啊啊啊~

H
hezhongfeng#2·10 年前

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

S
Smallpath#3·10 年前

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

H
hezhongfeng#4·10 年前
引用 Smallpath我所用过的所有框架中, redirect重定向就是完全重定向, 不会接受你在重定向前传的任何值, 本来redirect重定向的http返回码就是302,规定不会转发任何东西,比如header中...

@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);
};
参与回复
登录后即可参与回复。登录