2017-08-17 61 views
1

我有一个设置页面,您可以插入和删除一些过滤器。对于删除请求我用这个:Node.Js承诺重定向不起作用

$('#delete-filter').click(function (e) { 
     var filtername = $('#filter-list').val(); 
     var filterCount = $('#filter-list option').length; 
      var retVal = confirm("Are you sure to delete this filter?"); 
      if(retVal == true){ 
       $.ajax({ 
        url: "/settings?filtername=" + filtername, 
        method: 'DELETE', 
        dataType: "json", 
        success: function (result) { 

        } 
       }); 

      } 
      else{ 
       return false; 
      } 

    }); 

这里是我的这个页面路径:

router.delete('/settings', ensureAuthenticated, function (req, res, next) { 
    var promise = user.deleteFilter(req.session.user_id, req.query.filtername); 
    var promise2 = promise.then(function (data) { 
     req.session.selected_filter = data.selected; 
     res.redirect('/settings'); 
    }, function (error) { 
     console.log(error); 
    }) 
}) 

基本上我想重定向到页面设置,因此用新的数据重新加载页面。但是在承诺链中我不能使用任何响应函数。我使用重定向错误吗?或者我无法在承诺链中发送回复?

回答

3

你误认了这个问题。

当您发出HTTP重定向时,您会说:“您正在寻找的东西?取而代之。”

这不同于“浏览器应该将此URL作为新页面显示”。

遵循HTTP重定向,将设置页面发送到浏览器,然后浏览器在您的成功功能中使用result。 (你完全忽略它,因为你没有在该函数中放入任何东西)。

如果您希望浏览器加载一个新的页面,那么你就需要提供URL作为数据(而不是重定向),然后将该值赋给location.href

设置页面可能不应该动态确定,因此您可能只需将URL强制编码到成功函数中即可。

硬编码会更有意义,因为你不应该在响应发送重定向到DELETE request

如果成功应用DELETE方法,原始服务器 应该发送202(已接受)状态代码,如果动作可能 成功但尚未制定,则204(无内容)状态 代码(如果该动作已经制定并且没有进一步的信息是要提供的 或200(OK)状态代码如果已采取行动已制定 并且响应消息包含代表 de刻写状态。

+0

我想知道,你在哪里得到了OP寻找的提示“浏览器应该将此URL作为新页面显示”?我的意思是,他使用ajax =/ – Salketer

+0

@Salketer - Quote:“本质上我想重定向到页面设置,所以**页面重新加载**新数据” – Quentin

+0

我已经尝试'res.send({ href:“/ settings”});'而不是'res.redirect('/ settings')'。正如你所说的,我在成功方法中使用了location.href,但页面没有重新加载。它保持加载,没有任何反应。 –