Javascript 未处理的拒绝错误:Can';t使用节点发送邮件后设置邮件头
我正在尝试使用JS、Node和Express呈现视图,但收到以下错误“未处理的拒绝错误:发送后无法设置标题”。我知道这与异步回调有关,但是 我想不出确切的方法来修理它 我们认为,问题似乎不在于res.redirect(删除它不会显示数据),而在于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
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”。此异常是不言自明的,您试图在已发送响应的情况下向客户端发送响应。可能您的代码中存在其他错误,但要修复此异常,请将重点放在发送回响应时