表示重定向错误发送后无法设置标头

时间:2017-04-08 15:29:29

标签: node.js express mongoose

app.get('/', function (req, res) {
  mongoose.connect('mongodb://localhost/todo-list')
  Todo.find({completed: false}, function (err, todos) {
    if (err) throw err
    res.render('homepage', {
      allTodos: todos
    })
    mongoose.disconnect()
  })
})
//
app.post('/create', function (req, res) {
  // console.log(req.body)
  // res.send(req.body)
  todosController.create(req, res)
})

app.get('/listall', function (req, res) {
  res.redirect('/listall')
  todosController.list(req, res)
})
// and below is my controller

function list (req, res) {
  if (!mongoose.connection.db) mongoose.connect('mongodb://localhost/todo-list')
  Todo.find({}, function (err, todos) {
    if (err) throw err
    res.render('listall', {
      allTodos: todos
    })
    mongoose.disconnect()
  })
}

有人可以告诉我如何修复这个>。< 快递显示错误“发送后无法设置标题。” 在ServerResponse.setHeader(_http_outgoing.js:371:11)

3 个答案:

答案 0 :(得分:1)

问题来自于尝试向用户发送两次请求(通过渲染和重定向),此处:

  Intent intent = new Intent(this, BaseActivity.class);
  intent.putExtra("branch", branchLink);
  intent.putExtra("branch_force_new_session",true);
  pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);

您将用户重定向到listall视图,但之后您正在调用list方法,该方法尝试在此处呈现另一个页面:

app.get('/listall', function (req, res) {
    res.redirect('/listall')
    todosController.list(req, res)
})

您必须决定,如果您想将用户重定向到页面,或将其呈现给他,并删除其中一个。

答案 1 :(得分:0)

你只需删除这一行,你的/ listall路由应该有效:

res.redirect('/listall')

答案 2 :(得分:0)

您的函数todosController.list(req, res)似乎也有res.send / res.redirect ...方法。但是,如果有其他资源,您只能发送一次响应。请求流中的方法会出现此错误。

您可以从todosController.list方法重定向用户,并将其从此处移除app.get('/listall', function (req, res) { res.redirect('/listall') todosController.list(req, res) })

但请注意不要发送res。不止一次在一个单一的要求。流动。