Ошибка, невозможно установить заголовки после их отправки - PullRequest
0 голосов
/ 04 февраля 2019

Итак, я закодировал API в javasript, который работает с Mongoose и Express, и теперь, когда я хочу создать учетную запись, появляется ошибка:

"Ошибка: невозможно установить заголовкипосле того как они отправлены ".

Я пытался понять это с моим товарищем по команде, но мы не можем понять, что происходит ... Так что, если вы можете мне помочь, это будет очень дружелюбно

Создание учетной записи

router.post('/account/new', (req, res, next) => {
    var duplicate = checkForDuplicates(req.body)
    if (!duplicate) {
        var encryptedPassword;
        var clientIP;
        bcrypt.hash(req.body['password'], saltRounds, function (err, hash) {
            if (err) {
                res.status(400).send(err)
            }
            encryptedPassword = hash;
            clientIP = req.connection.remoteAddress;

            Account.findOne({ username: req.body['username'] }, (err, account) => {
                if (account != null) {
                    res.send("The account already exists")
                } else {
                    Account.create({ username: req.body['username'], email: req.body['email'], password: encryptedPassword, ip: clientIP }, (err, createdAccount) => {
                        if (err) {
                            res.status(400).send(err)
                            return
                        }
                        var informations = {
                            username: createdAccount.username,
                            id: createdAccount.id
                        }
                        res.status(201).send(informations)
                    })
                }
            })

        })


    } else {
        res.status(400).send("The account already exists")
    }
});

Схема учетной записи

const mongoose = require("mongoose")

var Schema = mongoose.Schema;

var AccountSchema = new Schema({
    username: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    lastip: {
        type: String,
        default: "0"
    },
    ip: {
        type: String,
        default: "0"
    },
    lastconnect: {
        type: Number,
        default: 0
    },
    exolytes: { type: String, default: "0"},
    weapons: { type: String, default: "1" },
    tools: { type: String, default: "1" },
    ships: { type: String, default: "1" },
    faction: { type: String, default: "0" },
    skins: {
        heads: { type: String, default: "1" },
        bodys: { type: String, default: "1" }
    },
    currentSkin: {
        head: { type: String, default: "1" },
        body: { type: String, default: "1" }
    },
    ores: {
        ore1: { type: Number, default: 0 },
        ore2: { type: Number, default: 0 },
        ore3: { type: Number, default: 0 },
        ore4: { type: Number, default: 0 }
    }
}, {
    collection: 'accounts'
});

var Account = mongoose.model("Accounts", AccountSchema, "accounts");

module.exports = Account

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Добавляйте возврат каждый раз, когда вы используете res.send(), что поможет вам в этом случае.

router.post('/account/new', (req, res, next) => {
  var duplicate = checkForDuplicates(req.body)
  if (!duplicate) {
    var encryptedPassword;
    var clientIP;
    bcrypt.hash(req.body['password'], saltRounds, function (err, hash) {
      if (err) {
        return res.status(400).send(err)
      }
      encryptedPassword = hash;
      clientIP = req.connection.remoteAddress;

      Account.findOne({ username: req.body['username'] }, (err, account) => {
        if (account != null) {
          return res.send("The account already exists")
        } else {
          Account.create({ username: req.body['username'], email: req.body['email'], password: encryptedPassword, ip: clientIP }, (err, createdAccount) => {
            if (err) {
              return res.status(400).send(err)
            }
            var informations = {
              username: createdAccount.username,
              id: createdAccount.id
            }
            return res.status(201).send(informations)
          })
        }
      })

    })


  } else {
    return res.status(400).send("The account already exists")
  }
});
0 голосов
/ 04 февраля 2019

Заметили ли вы, что в случае ошибки ваш код будет работать

           if (err) {
                res.status(400).send(err)
            }

Затем отправит ответ в Account.findOne.
Поскольку ответ уже отправлен, вы не можете сказать res.status(400) в Account.findOne блок

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