【问题标题】:NodeJS - Server responds with 404 and then loads the pageNodeJS - 服务器以 404 响应,然后加载页面
【发布时间】:2017-12-08 07:10:51
【问题描述】:

有人了解我的 nodeJS 应用程序中发生了什么吗? 当我使用 ajax 进行异步调用时,服务器首先响应 404 错误,然后加载页面。该应用程序运行良好,但我有很多无聊的日志说“发送后无法设置标头。”

这是路线部分

module.exports = function(passport) {
          var router = express.Router();
          ........
          router.get('/dashboard', isLogged, dashcontroller.showdashboard);
          router.get('/dashboard/general', isLogged, dashcontroller.general);
          ........
          return router;
    }

这里是控制器

exports.showdashboard = function(req, res, next) {
  if (req.user.status == 'active')
    res.render('dashboard', { title: 'title' , user: req.user});
  else
    res.redirect('/user/logout');

  next();
}


exports.general = function(req, res, next) {
  if (req.user.status == 'active')
    res.render('general', { title: 'title' , user: req.user});
  else
    res.redirect('/user/logout');

  next();
}

异步请求,客户端可以从 /dashboard 访问此代码,并驻留在 public/javascripts/code.js 中。客户发现它并毫无问题地执行它。

$(function() {
    $("li.infos").click(function() {
      $("li.basket").removeClass("active")
      $("li.infos").addClass("active")
        $('.main-container')
           .load('/user/dashboard/general');
    });
});

一切正常,但我仍然得到那些无聊的日志

GET /stylesheets/dashboard.css 304 0.555 ms - -
GET /javascripts/dashboard.js 304 0.280 ms - -
GET /javascripts/basket.js 304 0.323 ms - -
abc deserializeUser
Executing (default): SELECT `id`, `username`, `public_key`, `email`, `password`, `last_login`, `basketcount`, `status`, `activation_token`, `createdAt`, `updatedAt` FROM `users` AS `user` WHERE `user`.`id` = 6;

GET /user/dashboard/general 404 35.837 ms - 2290
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11)
    at ServerResponse.header (/home/me/Documents/app/node_modules/express/lib/response.js:730:10)
and the trace goes on

有人知道发生了什么吗? 谢谢你的建议

【问题讨论】:

    标签: javascript node.js ajax http-status-code-404


    【解决方案1】:

    Can't set headers after they are sent." 不是无聊的日志消息。

    您在编写 http 响应后致电 next(),这就是您面临问题的原因。 例如

    exports.showdashboard = function(req, res, next) {
       if (req.user.status == 'active')
         return res.render('dashboard', { title: 'title' , user: req.user});
       else
         return res.redirect('/user/logout');
    }
    

    并且,与exports.general 相同。

    【讨论】:

    • 是的,仅当您希望后续路由处理程序执行时才调用next(),如果您已经发送了响应,则几乎永远不会。
    猜你喜欢
    • 2020-05-19
    • 2015-06-09
    • 2014-05-31
    • 2022-10-23
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多