首页 > 解决方案 > 如何解决“将标头发送到客户端后无法设置标头”

问题描述

我该如何解决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);
});

标签: htmlnode.jsmongodbexpress

解决方案


您的错误原因:您试图两次发送单个请求的响应。

一个请求有一个响应。

发送响应后,您将无法针对同一请求再次发送它。在您的/addnameAPI 中,您尝试发送两次响应。所以删除一个。

.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");
    }
  });
});

推荐阅读