Как я могу решить «Невозможно установить заголовки после их отправки клиенту» - PullRequest
0 голосов
/ 25 сентября 2018

Как я могу решить Cannot set headers after they are sent to the client:

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

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Причина вашей ошибки: Вы пытаетесь отправить ответ на один запрос дважды.

Один запрос имеет один ответ.

После отправки ответа,Вы не можете отправить его снова для того же запроса. В вашем /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");
    }
  });
});
0 голосов
/ 25 сентября 2018

После того как вы выполните res.send, вы не можете вызвать его снова в том же запросе, он разрешает только один ответ на запрос.В вашем коде, я думаю, в этой части это может произойти:

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

В этом случае, когда вы сохраняете myData, вы отправляете ответ, но асинхронно вы уже отправили другой ответ ранее («Спасибо заРегистрация ").

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...