Javascript 未处理的拒绝错误:Can';t使用节点发送邮件后设置邮件头

Javascript 未处理的拒绝错误:Can';t使用节点发送邮件后设置邮件头,javascript,node.js,express,Javascript,Node.js,Express,我正在尝试使用JS、Node和Express呈现视图,但收到以下错误“未处理的拒绝错误:发送后无法设置标题”。我知道这与异步回调有关,但是 我想不出确切的方法来修理它 我们认为,问题似乎不在于res.redirect(删除它不会显示数据),而在于res.render和var spaces没有正确加载到EJS。当我们放置空格时,我们得到消息“objectpromise” 和我的控制器: const Space = require('../models').Space; module.export

我正在尝试使用JS、Node和Express呈现视图,但收到以下错误“未处理的拒绝错误:发送后无法设置标题”。我知道这与异步回调有关,但是 我想不出确切的方法来修理它

我们认为,问题似乎不在于res.redirect(删除它不会显示数据),而在于
res.render
var spaces
没有正确加载到EJS。当我们放置
空格
时,我们得到消息“objectpromise”

和我的控制器:

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));
  },
};
 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));
  },
我的看法是:

<!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>

MakersBnB
正文{padding top:80px;}
预订空间
列出一个空间
  • 英镑
这些路线

 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.post('/spaces/new', function(req,res){
    spaceController.create(req,res);
    res.redirect('/spaces');
  });
spaceController
中的逻辑已经异步处理对客户端的响应(成功和失败)

但是您立即发送同步响应(
res.redirect
),这将阻止您稍后发送异步响应。这会触发异常

从三条路由中删除
res.redirect
指令应该可以修复它

app.post('/users/new', function(req,res){
    userController.create(req,res);
    res.redirect('/');
  });
您基本上是以异步方式启动Space.create(),在它完成之前,您将使用重定向进行响应

你可以试试

app.post('/users/new', 
        userController.create,
        (res,req) => res.redirect('/')
      );
重定向将永远不会用它来实现,但您可以像这样使用userController.create return next()

create(req, res, next) {
    return Space
    .create({
      name: req.body.name,
      description: req.body.description,
      price: req.body.price,
    })
    .then((space) => {      
      res.locals.space = space || {};
      return next();
    })
    .catch(error => next(error));
  }
使用这个中间件

app.post('/users/new', 
        userController.create,
        (res,req) => res.status(200).send(res.locals.space)
      );
最近项目的例子:
您收到此错误是因为您正在为某些请求发送多个响应。对于一个请求,您只能发送一个响应

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

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

要修复此问题,请让您的控制器处理发送响应

例如:

app.post('/users/new', userController.create);
在控制器函数体中,还可以选择要渲染的视图

app.get('/spaces', spaceController.retrieve);
在控制器中:

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));
  },
};
 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));
  },

问题是你的控制器和路由器都会响应请求。例如,app.get(“/spaces”没有修复它,不幸的是-问题在于
res.render
var spaces
没有正确加载到EJS,我们认为。当我们放入
spaces
时,我们会得到消息“object Promise”。此异常是不言自明的,您试图在已发送响应的情况下向客户端发送响应。可能您的代码中存在其他错误,但要修复此异常,请将重点放在发送回响应时