javascript - 未处理的拒绝错误: Can't set headers after they are sent using Node

标签 javascript node.js express

我尝试使用 JS、Node 和 Express 渲染 View ,但收到此错误“未处理的拒绝错误:发送后无法设置 header ”。我知道这与异步回调有关,但是 我不知道如何修复它。

问题似乎不在于 res.redirect (删除它不会显示数据),而是在于 res.rendervar 空格我们认为没有正确加载到 EJS。当我们输入空格时,我们会收到消息“object Promise”。

const userController = require('../controllers').user;
const spaceController = require('../controllers').space;

module.exports = (app) => {
  app.get('/', function(req, res) {
      res.render('index.ejs');
  });

  app.post('/users/new', function(req,res){
    userController.create(req,res);
    res.redirect('/');
  });

  app.get('/spaces', function(req, res) {
    var spaces = spaceController.retrieve(req,res);
    res.render('spaces/index.ejs', {spaces});

  });

  app.get('/spaces/new', function(req, res) {
    res.render('spaces/new.ejs');
  });

  app.post('/spaces/new', function(req,res){
    spaceController.create(req,res);
    res.redirect('/spaces');
  });

};

还有我的 Controller :

const Space = require('../models').Space;

module.exports = {
  create(req, res) {
    return Space
    .create({
      name: req.body.name,
      description: req.body.description,
      price: req.body.price,
    })
    .then(space => res.status(201).send(space))
    .catch(error => res.status(400).send(error));
  },

  retrieve(req, res) {
    return Space
    .findAll()
    .then(space => {
      if (!space) {
        return res.status(404).send({
          message: 'Space Not Found',
        });
      }
      return res.status(200).send(space);
    })
    .catch(error => res.status(400).send(error));
  },
};

我的观点:

<!doctype html>
 <html>
 <head>
     <title>MakersBnB</title>
     <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css"> <!-- load bootstrap css -->
     <link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css"> <!-- load fontawesome -->
     <style>
         body        { padding-top:80px; }
     </style>
 </head>
 <body>
 <div class="container">

 <div class="col-sm-6 col-sm-offset-3">
   <div class="jumbotron text-center">

     <h1>Book a Space</h1>

<form action="/spaces/new" method="get">
  <button type="submit" class="btn btn-warning btn-lg">List a space</button>

</form>

<div class="spaces">
  <% spaces.each(function(space) { %>
        <ul>
          <li><%= space.name %></a></li>
          <li><%= space.description %></li>
          <li>£ <%= space.price %></li>
        </ul>
        <% });%>
</div>


 </div>

 </div>
 </body>
 </html>

最佳答案

您收到此错误是因为您针对某些请求发送了多个响应。您只能对一个请求发送一个响应。

例如,在 /users/new 路由中,您首先调用 userController.createuserController.create 发送响应作为函数体的一部分。

然后,您的代码返回到 /users/new 路由的回调,并调用 res.redirect('/') 来调用您的 / 路由也返回响应。

要解决此问题,请让您的 Controller 处理发送响应。

例如:

app.post('/users/new', userController.create);

在 Controller 函数的主体中,您还可以选择要渲染的 View

app.get('/spaces', spaceController.retrieve);

在 Controller 中:

 retrieve(req, res) {
    return Space
    .findAll()
    .then(spaces => {
      if (!spaces) {
        return res.status(404).send({
          message: 'Space Not Found',
        });
      }
      return res.status(200).render('spaces/index.ejs', {spaces});
    })
    .catch(error => res.status(400).send(error));
  },

关于javascript - 未处理的拒绝错误: Can't set headers after they are sent using Node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44053290/

相关文章:

javascript - 使用 javascript 验证时无法从表单获取值

javascript - 修改OnEdit函数

node.js - 通过模块导出重用 pg-pool

node.js - 使用 Express.js Node.js header (cURL) 中的 token

javascript - 根据循环变量的值给特定的 HTML 表格 block 着色的问题

javascript - ReactJS 组件渲染问题

javascript - 无法全局劫持/替换 Node 的要求

node.js - 安装phonegap时出现错误

node.js - SWIG 变量持久化

node.js - COR 错误 : Google Oauth from React to Express (PassportJs validation)