【问题标题】:After refresh "Cannot set headers after they are sent to the client"刷新后“发送到客户端后无法设置标头”
【发布时间】:2020-03-22 10:28:42
【问题描述】:

我使用 express js、mongoose 和 ejs 作为模板。

当我刷新我的页面时,在第二次或第三次尝试中,我收到了这个错误。

这是我的 app.js:

{consts..}

var index = require('./routes/index.js');
var users = require('./routes/users.js');

app.set("port", ("2401"));
app.set("views", __dirname + "/views");
app.set("view engine", "ejs");
app.use(express.static(path.join(__dirname, 'public')));

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

app.use('/', index);
app.use('/users', users);

var port = '2401';
app.set('port', port);

var server = http.createServer(app);

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);


function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  console.log('server started on port : ' + app.get('port'));
}

用户路由器:

{consts..}

router.get('/login', function (req, res) {
   users.getLogin(req, res);
});

router.post('/login', [
    check('email')
        .isEmail().withMessage('Please enter a valid email address')
        .trim()
        .normalizeEmail(),
    check('terms', 'Please accept our terms and conditions').equals('yes'),
],
    function (req, res) {
        users.postLogin(req, res);
    });

module.exports = router;

和控制器:

usersController.getLogin = function (req, res) {
    const connector = mongoose.connect(conStr, { useNewUrlParser: true, useUnifiedTopology: true });
    mongoose.connection.on('open', function (ref) {
        categories.find(function (err, cats) {
            if (err) {
                console.log("Error:", err);
            }
            else {
                    return res.render("../views/login.ejs", {
                    _: _,
                    categories: cats
                });
            }
        });
    });
}

索引路由器:

var express = require('express');
var router = express.Router();
var index = require("../controllers/indexController.js");

router.get('/', function (req, res) {
  index.list(req, res);
});
module.exports = router;

索引控制器:

var mongoose = require("mongoose");
var categories = require("../models/categories.js");
var _ = require("underscore");

var indexController = {};

indexController.list = function (req, res) {
  const connector = mongoose.connect(conStr, { useNewUrlParser: true, useUnifiedTopology: true });
  mongoose.connection.on('open', function (ref) {
    categories.find(function (err, cats) {
      if (err) {
        console.log("Error:", err);
      }
      else {
        console.log("indexe geldi");
        return res.render("../views/index.ejs", {
          _: _,
          categories: cats,
          sess: req.session
        });
      }
    })
  })
};

module.exports = indexController;

我几乎尝试了所有方法,但仍然没有进展。可以是关于“next()”的使用吗?

我还尝试了带有 next 的洞路由器 get/post 函数,带有 exec() 的 mongoose find 函数。

【问题讨论】:

  • 是的,我不使用 next 这就是为什么我想知道它是否是 abaut 它。我现在复制了 app.js。
  • 您要访问哪个端点来获取错误,POST/GET /users/login?您缺少index 路由代码。
  • 我添加了索引路由器。 “GET”时出现此错误。然而不是第一次得到,而是当我刷新页面时
  • 但是你打的是什么页面,什么端点,而你缺少索引控制器,需要看index.list
  • 你说得对,我完全忘了说,我的索引和登录页面都有问题。

标签: node.js express


【解决方案1】:

问题是您在每条路线上都打开了与 mongo 的连接,并且:

mongoose.connection.on('open' 正在触发过去的请求,已经完成的请求,这就是你收到 Cannot set headers after they are sent to the client 的原因。

mongoose.connect 和监听器移到每条路由之外。

usersController.getLogin = function (req, res) {

    categories.find(function (err, cats) {
            if (err) {
                console.log("Error:", err);
                return res.status(500).send('error');
            }
            else {
                    return res.render("../views/login.ejs", {
                    _: _,
                    categories: cats
                });
            }
      });

}

【讨论】:

  • 非常感谢!我更改了代码。像魅力一样工作!
猜你喜欢
  • 1970-01-01
  • 2021-09-11
  • 2018-05-25
  • 2021-06-27
  • 2021-06-18
  • 2020-11-14
  • 2020-09-05
  • 2019-02-06
相关资源
最近更新 更多