8

我正在尝试将 Express js 与 .ejs 视图一起使用。

我想在任何事件上将我的页面重定向到另一个页面,比如“onCancelEvent”

根据 Express js 文档,我可以使用 res.redirect("/home");

但我无法在我的 ejs 文件中获取 res 对象。

谁能告诉我如何访问 .ejs 文件中的 req 和 res 对象

请帮忙。

谢谢

4

2 回答 2

12

简答

如果您想访问 EJS 模板中的“req/res”,您可以将 req/res 对象传递给控制器​​函数中的 res.render()(此请求特定的中间件):

res.render(viewName, { req : req, res : res /* other models */};

或者在一些服务所有请求(包括这个)的中间件中设置 res.locals:

res.locals.req = req;
res.locals.res = res;

然后您将能够访问 EJS 中的“req/res”:

<% res.redirect("http://www.stackoverflow.com"); %>

进一步讨论

但是,你真的要在视图模板中使用 res 来重定向吗?

如果事件向服务器端发起一些请求,它应该在视图之前通过控制器。因此,您必须能够检测到条件并在控制器内发送重定向。

如果事件仅发生在客户端(浏览器端)而不向服务器发送请求,则可以通过客户端 javascript 完成重定向:

window.location = "http://www.stackoverflow.com";
于 2013-01-17T11:13:45.120 回答
1

在我看来:你没有。

最好在调用之前创建确定需要在某些中间件中重定向的逻辑res.render()

我的论点是您的 EJS 文件应包含尽可能少的逻辑。循环和条件是可以的,只要它们是有限的。但是所有其他逻辑都应该放在中间件中。

function myFn( req, res, next) {
  // Redirect if something has happened
  if (something) {
    res.redirect('someurl');
  }
  // Otherwise move on to the next middleware
  next();
}

或者:

function myFn( req, res, next) {
  var options = {
    // Fill this in with your needed options
  };

  // Redirect if something has happened
  if (something) {
    res.redirect('someurl');
  } else {
    // Otherwise render the page
    res.render('myPage', options);
  }
}
于 2016-04-27T23:09:49.293 回答