Javascript Expressjs/Node.js-res.redirect()未加载页面

Javascript Expressjs/Node.js-res.redirect()未加载页面,javascript,node.js,mongoose,express,Javascript,Node.js,Mongoose,Express,我有一个页面,其中有一个路径GET/team,它正在加载一个团队列表,还有一个路径DEL/team,它正在从/team/:key中删除一个团队。因此,您导航到一个团队的个人资料页面并将其删除,删除时,它会将您重定向到/team页面。我已将日志放入控制台,它正在成功删除团队,并且wierdly说它正在加载/team,但浏览器没有加载此日志。我已经把代码放在下面了,有什么想法吗 路线: app.get('/team'/*, lim("Must be logged in to see teams"

我有一个页面,其中有一个路径
GET/team
,它正在加载一个团队列表,还有一个路径
DEL/team
,它正在从
/team/:key
中删除一个团队。因此,您导航到一个团队的个人资料页面并将其删除,删除时,它会将您重定向到
/team
页面。我已将日志放入控制台,它正在成功删除
团队
,并且wierdly说它正在加载
/team
,但浏览器没有加载此日志。我已经把代码放在下面了,有什么想法吗

路线:

  app.get('/team'/*, lim("Must be logged in to see teams")*/, getAllTeams, function(req, res){
    util.log('Serving request for url [GET] ' + req.route.path);
    // Pass it the list of all Teams
    res.render('team', {'teamsList' : req.teamsList} );
  });

  app.get('/team/:key', function(req, res) {
    util.log('Serving request for url [GET] ' + req.route.path);
    Team.findByKey(req.params.key, function(err, teamData){
      if(!err && teamData){
        teamData = teamData;
        res.render('teamDetails', { 'teamData' : teamData } );
      } else {
        util.log('Error in fetching Team by key : ' + req.params.key);
        res.json({
          'retStatus' : 'failure',
          'msg' : 'Error in fetching Team by key ' + req.params.key
        });
      }
    });
  });

  /**
    * DEL /team/:key
    * Delete Team by key
    */
  app.del('/team/:key', getAllTeams, function(req, res) {
    util.log('Serving request for url [DEL] ' + req.route.path);    
    Team.remove({key : req.params.key}, function(err){
      var message = '';
      var retStatus = '';
      if (!err) {
        util.log('Successfully deleting Team with key: ' + req.params.key);
        message = 'Successfully deleting Team with key: ' + req.params.key;
        retStatus = 'Success';
        res.redirect('/team');
      } else {
        util.log('Error deleting Team with key: ' + req.params.key + 'Error: ' + util.inspect(err));
        res.json({
          'retStatus' : 'failure',
          'msg' : 'Error in fetching Team with key ' + req.params.key
        });
      }
    });
  });
JavaScript+HTML模板:

        button#teamDelete.btn.btn-danger.btn-mini(type="submit", value="Delete Team") Delete
        script(type='text/javascript')
            $('#teamDelete').live('click',function(){ 
                var teamId = #{teamData.key};
                $.post('/team/' + teamId, { _method : 'delete' }, function(response) {
                    console.log(response);
                    if(response.retStatus === 'Success') {
                        if('/team' && '/team' !== "") {
                            window.location = '/team';
                        }
                    }
                });
            });
控制台日志:

10 Mar 11:52:01 - Serving request for url [GET] /team
10 Mar 11:52:02 - Serving request for url [GET] /team/:key
10 Mar 11:52:03 - Serving request for url [DEL] /team/:key
10 Mar 11:52:03 - Successfully deleting Team with key: 1362855941128
10 Mar 11:52:03 - Serving request for url [GET] /team
GetAllTeam:

var getAllTeams = function(req, res, next){
  Team.getAll(function(err, teamsList){
    if(!err && teamsList){
      req.teamsList = teamsList;
      return next();
    }
  });
};
Team.getAll(团队架构)


要快速解决问题,只需将重定向url添加到响应中,然后在客户端执行以下操作:

if (redirectUrl && redirectUrl !== "")
    window.location = redirectUrl;
您的请求是POST($.POST),而您的路由是app.del,因此它永远不会到达app.del路由内的res.redirect

为什么不使用app.post

更新:

假设$.post在这里发送HTTP DEL请求发生了什么:服务器发送302响应,但没有数据,但浏览器从不在服务器指示时发送另一个获取路由的请求(或者jQuery是否也处理重定向?不确定)。res.redirect()是实际的HTTP响应,而不是像ASP.NET中那样将请求重新路由到另一个路由的内部服务器端指令(实际上这是错误的)。。。路由的设计目的是接收请求,用响应进行回复,然后忘记它。您需要将路由与处理路由的实际函数分开,然后才能调用该函数,而不是发送重定向

代码建议

在app.del(“/team/:key”

...
    retStatus = 'Success';
    // res.redirect('/team');
    res.send({
      retStatus : retStatus,
      redirectTo: '/team',
      msg : 'Just go there please' // this should help
    });
...
$.post(“/team/”)中的客户端

...
    $.post('/team/' + teamId, { _method : 'delete' }, function(response) {
        console.log(response);
        if(response.retStatus === 'Success') {
            // not sure what did you mean by ('/team' && '/team' !== "")
            // if('/team' && '/team' !== "") {
            if (response.redirectTo && response.msg == 'Just go there please') {
                window.location = response.redirectTo;
            }
        }
    });
...
但我不确定它是否能工作,因为我不明白您的
getAllTeams
是做什么的,以及为什么要在req中存储
teamList
。如果您想在会话中存储,而不是假设中间件配置正确,那么您需要使用req.session。如果您只需要在请求中存储它,并且您的getAllTeams会准备此会话列表团队最好存储在res.locals中(比如res.locals.teamList)。 并确保您的GetAllTeam调用next。因此,基本上您的GetAllTeam应该如下所示:

function getAllTeams (req, res, next) {
    res.locals.teamList = [/* whatever */];
    next();
}
然后,您可以在路由处理程序中使用res.locals.teamList而不是req.teamList

res.render('team', {teamsList : res.locals.teamsList} );
“团队”模板也可能有问题

明确建议:)

还有,使用Express的方式使得扩展/管理应用程序非常困难。我不记得确切的位置,但在DOCS中的某个地方,他们写道,Express应该被用作应用程序框架的基础,而不是像大多数PHP框架那样完整的框架。它给了您大量的灵活性和灵活性,而且。因此有必要提前考虑您的应用程序体系结构


express最强大的功能是,您可以让许多特定于路由的处理程序/中间件处理任何路由,通过next()将控制权传递给彼此.我有一个静态表,它定义了每个路由上使用的处理程序,允许在一个页面上查看整个应用程序的30个左右路由。该表用于在应用程序启动时动态组装路由。它带来了很大的灵活性和可管理性(我可以将粘贴处理程序从一个路由移动/复制到另一个路由-每个处理程序都表示为一个单词)和代码重用。我还在客户端路由中使用相同的路由定义散列。

团队获取路由需要一个参数req.teamsList来呈现页面。它是否在重定向中可用?@almypal如果我添加
{teamsList':req.teamsList}
到重定向,就像我在呈现
/team
页面和加载项
getAllTeams
时一样,控制台中没有显示任何内容,也没有加载任何内容。如何将其添加到重定向中?@almypal我尝试添加
res.render('team',{'teamsList':req.teamsList})
但是没有加载任何内容,我认为它不适用于
res.render
但是它也不适用于简单的重定向,因为它需要一个团队列表,正如您所说的,知道如何解决问题吗?/team GET route是否独立工作…如果是的话,参数是如何随请求一起发送的…所以替换每个
>重定向URL
/team
你在说什么?仍然无法让它工作,你能看到HTML代码是否有任何错误吗?当我转到stackoverflow.com上的控制台并运行window.location=“/hello”;我去了stackoverflow.com/helloHe,他正在使用的_方法可能在服务器上有methodOverride。我只是试着将它改为
app.post
,而不是
app.del
,并删除了
\u方法:从HTML页面的JS中删除
,但控制台上仍然显示路由到
/team
,但没有加载任何内容owser。也谢谢你的建议,我会考虑的。@RoelvanUden正确,我正在使用它。@esp:_方法是由Connect for NodeJS提供的methodOverride中间件允许的字段。@RoelvanUden得到了它,谢谢。尽管我仍然不明白为什么要使用这个中间件,因为你可以使用app.post来处理发布请求…只有当你们有一些手机应用程序使用的API,你们不想在浏览器中使用DEL,但不是当你们从头开始开发的时候。。。
res.render('team', {teamsList : res.locals.teamsList} );