html - 如何解决“将标头发送到客户端后无法设置标头”
问题描述
我该如何解决Cannot set headers after they are sent to the client
:
应用程序.js
var express = require('express');
var session = require('express-session');
var mongoose = require('mongoose');
var app = express();
var ejs = require('ejs');
var port = 3000;
var bodyParser = require('body-parser');
var mongoDB = "mongodb://localhost:27017/vinavdb";
app.set('views', __dirname + '/admin') app.engine('html', ejs.renderFile);
app.set('view engine', 'ejs');
app.set('trust proxy', 1);
app.use(session({
secret: 'dsghbrtdfhbdfg64545TRYFFHGGJNN',
resave: false,
saveUninitialized: true
}))
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
var sess;
mongoose.Promise = global.Promise;
mongoose.connect(mongoDB, {
useNewUrlParser: true
});
var nameSchema = new mongoose.Schema({
firstname: String,
lastname: String,
email: String,
password: String
});
var User = mongoose.model("User", nameSchema);
app.get("/", (req, res) => {
sess = req.session;
if (sess.email) {
res.redirect("/admin");
} else {
res.sendFile(__dirname + "/index.html");
}
});
app.get("/login", (req, res) => {
res.sendFile(__dirname + "/login.html");
});
app.post("/addname", function(req, res) {
var myData = new User(req.body);
User.findOne({
email: req.body.email
}, function(err, resv) {
if (resv == null) {
myData.save().then(item => {
res.send("Name saved to database")
}).catch(err => {
res.status(400).send("Unable to save to database");
});
res.send("ThankYou For your Registration")
} else if (resv.email == req.body.email) {
res.send("Email is already registered");
} else {
res.send("Srry data is not allowed");
}
});
});
app.post("/login", function(req, res, next) {
User.findOne({
email: req.body.email
}, function(err, vals) {
if (vals == null) {
res.end("Invalid Logins");
} else if (vals.email == req.body.email && vals.password == req.body.password) {
sess = req.session;
sess.email = req.body.email;
res.redirect('/admin');
} else {
res.send("Srry data is not allowed");
}
});
});
app.route('/admin').get(function(req, res, next) {
sess = req.session;
if (sess.email) {
res.send(__dirname + "/admin/index.html");
} else {
res.write('Please login first.');
}
})
app.listen(port, () => {
console.log("Server listening on port " + port);
});
解决方案
您的错误原因:您试图两次发送单个请求的响应。
一个请求有一个响应。
发送响应后,您将无法针对同一请求再次发送它。在您的/addname
API 中,您尝试发送两次响应。所以删除一个。
这.save()
是异步函数,因此节点不会
res.send("ThankYou For your Registration")
先等待并执行,一旦保存记录,它将尝试发送res.send("Name saved to database")
,因此您会在这里收到错误。
app.post("/addname", function(req, res) {
var myData = new User(req.body);
User.findOne({
email: req.body.email
}, function(err, resv) {
if (resv == null) {
myData.save().then(item => {
console.log("Name saved to database")
res.send("ThankYou For your Registration")
}).catch(err => {
res.status(400).send("Unable to save to database");
});
} else if (resv.email == req.body.email) {
res.send("Email is already registered");
} else {
res.send("Srry data is not allowed");
}
});
});
推荐阅读
- haskell - 如何在 Haskell 中对函数进行柯里化
- javascript - 将不同网站的内容设置为 JS 变量
- tensorflow - 简单模型无法在 tpu 上运行(在 colab 上)
- php - 上传文件并以原始名称保存在存储文件夹中
- node.js - 收到客户端响应后如何停止计时器运行?
- javascript - 通过 SPA Web 应用程序的屏幕截图生成报告 - 设计选择和选项
- swift - Swift 短路与逻辑运算符未按预期工作
- php - 在 MySQL 中通过在 JSON 列上执行连接从两个表中获取数据时遇到问题
- android - ImageView 源始终覆盖其背景 Android
- python - Pandas:给定特定信号值的前进和后退行数