[help]Nodejs中express 的 res.redirect('..') 不会返回到上一级目录?

[help]Nodejs中express 的 res.redirect(’…’) 不会返回到上一级目录?

完整的routes/users.js:

var express = require('express');
var router = express.Router();
var myMongoose = _require('myMongoose');
var User = myMongoose.getModel('user');
var getUsers = function (callback) {
  User.find(function (err, users) {
    if (err) {
      throw err;
    }
    callback && callback(users);
  });
};
var addUser = function (user, callback) {
  var data = new User(user);
  data.save(function (err) {
    if (err) {
      throw err;
    }
    callback && callback();
  });
};
/* GET users listing. */
router.get('/', function (req, res) {
  getUsers(function (users) {
    res.render('users', { title: 'users', users: users });
  });
});
router.get('/add', function (req, res) {
  res.render('users_add', { title: 'addUser' });
});
router.post('/add', function (req, res) {
  if (!req.body.name) {
    res.send('name is required');
    return;
  }
  if (!req.body.password) {
    res.send('password is required');
    return;
  }
  if (!req.body.sex) {
    res.send('sex is required');
    return;
  }
  addUser(req.body, function () {
    res.redirect('..');
  });
});
module.exports = router;

我的当前目录是/users/add,处理一个post请求,添加完成后我希望返回到/users目录,显示所有的用户,但是跳回首页去了

补充下,我其实说的就是url,不是目录,我post的页面是http://localhost:3000/users/add 提交后,我希望能跳转回http://localhost:3000/users

不知道是不是我哪里写的有问题,感觉这里的路径都是相对users/的,也就是app.js里定义的

var users = require('./routes/users');
app.use('/users', users);

我把重定向写成这面的形式,可以达到我返回上一级路径的目的,不过总觉得有点拙

res.redirect('add/..');

6 回复

在Express应用中,res.redirect('..') 这种用法不会实现你想要的效果。res.redirect() 方法接受的是一个绝对路径或相对路径,而 .. 表示上一级目录,这在URL中并不适用。

解决方案

你可以直接使用 /users 这样的绝对路径来实现跳转到用户列表页。

示例代码

router.post('/add', function (req, res) {
  if (!req.body.name) {
    res.send('name is required');
    return;
  }
  if (!req.body.password) {
    res.send('password is required');
    return;
  }
  if (!req.body.sex) {
    res.send('sex is required');
    return;
  }

  addUser(req.body, function () {
    // 使用绝对路径跳转到 /users
    res.redirect('/users');
  });
});

解释

  • res.redirect('/users'):这里使用了绝对路径 /users,它表示从根目录开始的路径。因此,无论你在哪个路由,都会跳转到 /users 路径。

  • res.redirect('add/..'):虽然这种写法也可以工作,但不推荐,因为它依赖于当前路径的结构,不够灵活且难以维护。

总结

为了确保你的应用程序具有良好的可维护性和灵活性,建议使用绝对路径来实现重定向。这样无论你的路由如何变化,重定向逻辑都能正确地工作。


不要看当前目录,看实际url

认真看文档

return res.redirect(‘back’);

你post的时候路径是/add,redirect(’…’)就到了/

在Express中,res.redirect() 方法用于重定向客户端到指定的URL。你提到希望在添加用户后重定向到 /users 而不是 /users/add

你可以使用绝对路径或相对于应用根目录的路径来实现这一点。下面是一个示例代码,展示了如何正确地进行重定向:

router.post('/add', function (req, res) {
  if (!req.body.name) {
    res.send('name is required');
    return;
  }
  if (!req.body.password) {
    res.send('password is required');
    return;
  }
  if (!req.body.sex) {
    res.send('sex is required');
    return;
  }
  addUser(req.body, function () {
    // 使用绝对路径进行重定向
    res.redirect('/users');
  });
});

在这个例子中,res.redirect('/users') 会将客户端重定向到 /users 路径,这样就可以看到所有用户列表了。

另外,如果你希望使用相对路径,也可以这样做:

res.redirect('../');  // 返回上一级目录

不过,使用绝对路径(如 /users)更清晰,并且不容易出错。

回到顶部