【问题标题】:What is the difference between redirect and next in NodeJs?NodeJs中的redirect和next有什么区别?
【发布时间】:2017-11-24 06:44:22
【问题描述】:

我很不明白这两者的区别:

app.get('*', function(req, res, next) {
  next();
 //ROUTE 1
});

app.get('*', function(req, res) {
  res.redirect('/some');
  //ROUTE 2
});

app.get('/some', function(req, res) {
  res.send("success");
  //ROUTE 3
});

当我尝试向ROUTE 1 发出请求时,我得到响应success,但ROUTE 2 没有显示此响应。这是为什么呢?

我想做的是:

每个请求都应该从 ROUTE 1 传递,并且控制应该被处理到一个 SPECIFIC 路由,我会在其中写 ROUTE if-else 语句(不像 @ 987654327@,将控制权发送到下一个 MATCHING 路由)。

例如:

app.get('*', function(req, res, next) {
  if(x==y){
    //call SPECIFIC route 3 
  } else {
    // call SPECIFIC route 4 (another route)
    //ROUTE 1
});

我尝试通过重定向来做到这一点,但它不起作用。

谢谢。

编辑:

  • 路由将是:/checkIfSession 存在。我会使用 express-session 来检查用户的用户名是否存在于会话中。

如果存在,我想将控制权发送给if,否则else

假设请求是:

  1. http://198.168.43.200:3000/checkIfSession

  2. http://198.168.43.200:3000/some

(我只会调用第一个请求)。

编辑 2:我尝试了以下操作,但在请求时没有得到任何响应:

app.use(function (req, res, next) {
    if(2==2){
        res.redirect("/session");
    } else {
        res.end("else");
   }
});

app.get("/session", function(req, res){
    res.write("session");
    res.end();
});

app.get("/some", function(req, res){
    res.write("some");
    res.end();
});

请求:/some

【问题讨论】:

  • 你用什么确切 uri来试试这个?
  • 什么是 x 和 y 在您的示例中是服务器端的某个变量还是您从客户端获得的东西?我希望你的所有路线都经过一个特定的条件,你可以使用middleware
  • res.redirect 将满足您的要求。不需要下一个。但是,如果您提到 * ,任何请求都将进入此路由,而不管您对该路由的定义如何,因此在您的情况下您可能会陷入无限重定向。例如:如果您在 * 之后定义了 /test,那么对 /test 的请求将被发送给 *。
  • 请检查编辑。
  • 看你的编辑我同意@warl0ck 你想实现某种形式的middleware

标签: javascript node.js express


【解决方案1】:

我想如果您希望您的路线首先通过某种身份验证,您可以在您的路线中使用middleware

下面是示例代码:

app.get('/some', checkSession, function(req, res) {
  res.send("success");
});

// this is the middleware function

function checkSession(req, res, next) {
    // do your checking here
    if (x===y) {
        next();
        //continue users access to protected API
    } 
    else {
        res.redirect('/');
        // redirect user to the default login page
    }
} 

在上面这个例子中有2 Cases

案例1

x === y 从您给定的示例中我假设用户已登录,因此当用户访问您网站的/some 部分时,他将从服务器收到Success

这是您的next() 函数的使用,即它继续执行该api 或发送用户请求的任何数据。在你的编程中类似于continue

案例2

x!==y 现在用户是not authenticated or logged in 并且用户仍在尝试访问您网站的/some 部分。在这种情况下,用户将被重定向到您为网站设计的任何内容的login 页面,以便他/她重新输入他/她的凭据。

在这里,您的 redirect 函数会重定向用户而不发送任何数据。类似于break

【讨论】:

  • 这最终表明我应该使用 res.redirect 来“调用”特定路由?这是我的基本问题。
  • see here next() 继续用户访问 api,而重定向将用户发送到该页面。我会更新答案以使其更清楚
  • 现在我收到了这个错误:XMLHttpRequest 无法加载192.168.43.200:3000/some。预检响应无效(重定向)
  • 我从 angularjs 的 ajax 发出这个请求
  • 当然,但首先是您回答的这个问题吗??
猜你喜欢
  • 1970-01-01
  • 2020-08-26
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 2012-08-02
  • 2013-02-07
  • 2016-06-20
相关资源
最近更新 更多