NodeJS API POST请求未通过

时间:2019-07-07 03:17:46

标签: node.js mongodb nodeapi

我正在构建用于用户身份验证的基于Node Express的API。我正在使用mongo存储数据。使用邮递员,我通过传递以下对象

来提交/ post请求
{
"username": "abc",
"password": "abc123",
"email": "abc@ghi.com"
}

在要求正文下。

这是我的/ post函数在代码中的外观:

//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是未定义的。因此看来邮递员的请求没有正确处理。

编辑: 这是模式:

   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 个答案:

答案 0 :(得分:1)

您不能在.pre挂钩中使用箭头功能,因为箭头功能不会绑定“ this”。 “ this”应该是指将要保存的每个个人用户。但是,如果在箭头函数中使用“ this”,它将指向全局对象。运行此代码console.log(this),您将看到。将箭头功能用于独立功能。在您的情况下,您正在创建对象的一部分的方法,因此应避免使用箭头功能

我不使用.pre,因为一些猫鼬查询绕过了猫鼬中间件,所以您需要做额外的工作。因此,我改为在路由器内部对密码进行哈希处理,因此与用户相关的所有内容都将放在同一位置。真理的唯一来源

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/

答案 1 :(得分:0)

您的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 = this)”给出了您所期望的。

答案 2 :(得分:0)

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) {
            });
        });
    });
}