【问题标题】:Error: data and salt arguments required错误:需要数据和盐参数
【发布时间】:2017-07-10 15:08:58
【问题描述】:

我正在尝试使用以下发布请求将用户保存到 mongodb 数据库,但我收到错误 bcrypt Error: data and hash arguments required 。这是一个非常简单的代码设置,但我无法弄清楚任何事情错了。 模型/users.js

const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const confic = require('../models/users');

// User schema
const UserSchema = mongoose.Schema({
	name: {
		type: String,
	},
	email: {
		type: String,
		required: true
	},
	username:{
		type: String,
		required: true
	},
	password: {
		type: String,
		required: true
	}
});

const User = module.exports = mongoose.model('User', UserSchema);

module.exports.getUserById = function(id,callback){
	User.findById(id,callback);
}

module.exports.getUserByUsername = function(username,callback){
	const query = {username:username}
	User.findOne(query,callback);
}

module.exports.addUser= function (newUser, callback) {
   bcrypt.genSalt(10,(err,salt) => {
   	bcrypt.hash(newUser.password, salt , (err, hash) =>{
        if(err) throw (err);

        newUser.password=hash;
        newUser.save(callback);
   	});
   });
}
路线/users.js

const jwt = require('jsonwebtoken');
User = require('../models/users')

// // Register
router.post('/register', (req, res, next) => {
  var newUser = new User({
    name: req.body.name,
    email: req.body.email,
    username: req.body.username,
    password: req.body.password
  });

  User.addUser(newUser, (err, User) => {
    if(err){
      // res.json({success: false, msg:'Failed to register user'});
    } else {
      // res.json({success: true, msg:'User registered'});
    }

  });

});

// Authenticate
router.post('/authenticate', (req, res, next) => {
  res.send('AUTHENTICATE');
});

// Profile
router.get('/profile', (req, res, next) => {
  res.send('PROFILE');
});

module.exports = router;
服务器正在运行,但在使用 postman chrome post request 后显示错误,并且服务器停止工作,如图所示。

【问题讨论】:

  • 您在请求时是否验证了请求正文的内容?
  • (“姓名”:“abc”,“电子邮件”:“abc@gmail.com”,“用户名”:“abcd”,“密码”:“12345”)
  • 这是正文中发送的内容
  • 您能否确认正在生成的用户记录在调用 addUser 函数时设置了密码字段?您可以在 addUser 函数中或之前记录密码字段的内容。
  • 在你的User 模块中调用bcrypt.genSalt 之前,你能登录newUser 吗?

标签: javascript node.js mongodb


【解决方案1】:

错误来自bcrypt.hash 方法。 在您的情况下,您有以下代码:

bcrypt.hash(newUser.password, salt , (err, hash) => { ... }

我认为您的问题来自必须为空的newUser.passwordnullundefined)。错误显示data and salt arguments required。看起来你的盐是正确生成的,而你没有检查newUser.password === undefined,所以这是我的赌注:不知何故,newUser.password 是未定义的。

此外,您可以检查 genSalt 方法是否正常工作,方法是在调用 if(err) throw (err); 后添加 bcrypt.hash 方法。

【讨论】:

  • 在生成盐之前记录newUser怎么样?
  • 实际上我不知道该怎么做,我只是对在生成盐之前记录 newUsers 感到困惑,请解释一下?
  • 这样做,您将能够检查在流程的这个阶段,newUser.password 是否有值,或者它是否是undefined。那么,如果是undefined,则错误来自到这里之前的数据课程
  • 是的,你是对的 newUsers.password 现在是未定义的,我该怎么解决这个问题???
  • 您可以在 newUser 创建后立即登录,以查看此时 newUser.password 是否未定义
【解决方案2】:

删除 bcrypt.hash() 中的箭头 =>。使用老式方法定义function() {}

【讨论】:

    【解决方案3】:

    每个猫鼬文档:https://mongoosejs.com/docs/faq.html

    问。我正在为虚拟、中间件、getter/setter 或方法使用箭头函数,而 this 的值是错误的。

    A.箭头函数对 this 关键字的处理与传统函数大不相同。 Mongoose getter/setter 依赖于此来让您访问您正在写入的文档,但此功能不适用于箭头函数。不要对 mongoose getter/setter 使用箭头函数,除非不打算访问 getter/setter 中的文档。

    【讨论】:

      【解决方案4】:

      确保提供的属性与提供的一样,在我的情况下,我发送了Password 属性,大写为P,然后将password 和一个小的p 字母传递给@987654325 @函数。

      【讨论】:

        【解决方案5】:

        当我使用纯文本模式进行测试时,我收到了这个错误(需要数据和盐参数),一旦我更改为 json,就可以了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-23
          • 1970-01-01
          • 1970-01-01
          • 2020-12-13
          • 2020-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多