我尝试使用 JS、Node 和 Express 渲染 View ,但收到此错误“未处理的拒绝错误:发送后无法设置 header ”。我知道这与异步回调有关,但是 我不知道如何修复它。
问题似乎不在于 res.redirect (删除它不会显示数据),而是在于 res.render
和 var 空格
我们认为没有正确加载到 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.create
。 userController.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/