NodeJS API POST-запрос не проходит через - PullRequest
0 голосов
/ 07 июля 2019

Я строю Node, Express API для аутентификации пользователей. Я использую монго для хранения данных. Используя почтальона, я отправил запрос / post, передав следующий объект

{
"username": "abc",
"password": "abc123",
"email": "abc@ghi.com"
}

под требованием.

Вот так выглядит моя / пост-функция в коде:

//create one user
router.post('/createUser', async (req, res) => {
  if (!req.body.email || !req.body.password || !req.body.username) {
    return res.status(400).send({
      message: "No username/password/email specified"
    });
  }
  const newUser = new User({
    email: req.body.email,
    username: req.body.username,
    password: req.body.password
  });

await User.create(newUser, (err, data) => {
    //res.send(data);
    if(err) {
      console.log(err);
      res.status(500).send('Error creating user');
    }
  });
});

Метод User.create () вызывает метод .save () под одеялом. У меня есть предварительное условие сохранения, чтобы зашифровать пароль. При запуске сообщения я получаю сообщение об ошибке UnhandledPromiseRejectionWarning: Error: data and salt arguments required

Я сделал некоторые записи в консоли и заметил, что это происходит, потому что user.password входит как неопределенный. Похоже, мой запрос от почтальона не проходит должным образом.

Edit: Вот схема:

   const userSchema = new mongoose.Schema({
  id: {
    type: Number
  },
  email: {
    type: String,
    unique: true,
    required: true,
  },
  username: {
    type: String,
    unique: true,
    required: true
  },
  password: {
    type: String,
    required: true
  },
});

userSchema.pre('save', (next) => {
  const user = this;
  console.log(user.password);
  bcrypt.hash(user.password, 10, (err, hash) => {
    if (err) {
      next(err);
    } else {
      user.password = hash;
      next();
    }
  });
});

Может кто-нибудь помочь мне понять, что не так?

Ответы [ 3 ]

1 голос
/ 07 июля 2019

Вы не можете использовать функцию стрелки в ловушках .pre, потому что функция стрелки не связывает «this». «Это» должно относиться к каждому отдельному пользователю, который собирается быть сохраненным. однако если вы используете «this» внутри функции стрелки, она будет указывать на глобальный объект. запустите этот код console.log (this) вы увидите. используйте функции стрелок для автономных функций. в вашем случае вы создаете метод, который является частью объекта, поэтому вам следует избегать использования функции стрелки

Я не использую .pre, потому что некоторые запросы mongoose обходят промежуточное ПО mongoose, поэтому вам нужно проделать дополнительную работу. поэтому вместо этого я хэширую пароль внутри маршрутизатора, поэтому все, что связано с пользователем, будет в том же месте. единственный источник правды

const bcrypt = require("bcrypt");
router.post('/createUser', async (req, res) => {
  if (!req.body.email || !req.body.password || !req.body.username) {
    return res.status(400).send({
      message: "No username/password/email specified"
    });
  }
  const newUser = new User({
    email: req.body.email,
    username: req.body.username,
    password: req.body.password
  });
//we created newUser and now we have to hash the password
  const salt = await bcrypt.genSalt(10);
  newUser.password = await bcrypt.hash(newUser.password, salt);
  await newUser.save();
  res.status(201).send(newUser)
  //201 code success for something is created
});

вот список кодов состояния http:

https://httpstatuses.com/

0 голосов
/ 07 июля 2019
signUp: (req, res, next) => {
    bcrypt.genSalt(10, (err, salt) => {
        bcrypt.hash(req.body.password, salt, (err, hashedPass) => {
            let insertquery = {
                '_id': new mongoose.Types.ObjectId(),
                'username': req.body.username,
                'email': req.body.password,
                'salt': salt,
                'password': hashedPass
            };
            user.create(insertquery, function (err, item) {
            });
        });
    });
}
0 голосов
/ 07 июля 2019

Пароль от почтальона будет получен на ваш код NodeJS.

В вашем коде:

const newUser = new User({
    email: req.body.email,
    username: req.body.username,
    password: req.body.password
  });

когда вы сделаете это, ваш ожидаемый вывод из newUser изменится.

поэтому, когда ваш код достигнет здесь ...

  const user = this;
  console.log(user.password);

Вместо регистрации user.password попробуйте зарегистрировать самого пользователя как ...

console.log(user)

и посмотрите, если "(const user)= это) "дает то, что вы ожидали.

...