[英]"Error: Illegal arguments: string, undefined" and stop server in node JS
我正在尝试在节点 JS 中构建日志记录应用程序。 在这里密码验证应用程序不能正常工作。 当我输入用户名和密码时,出现以下错误并停止服务器。
this is the error.
这是身份验证部分的代码
passport.use(new LocalStrategy(
function(username, password, done) {
User.getUserByUsername(username, function(err, user){
if(err) throw err;
if (!user) {
return done(null, false, {message: 'Unknown user'});
}
User.comparePassword(password, user.password, function(err, isMatch){
if(err) throw err;
if (isMatch) {
return done(null, user);
} else {
return done(null, false, {message: 'Invalid password'});
}
});
});
}));
此代码适用于未知用户。 但它不适用于比较用户名和密码。 我在这里看不到任何错误。 我需要帮助解决这个问题。
我在这里发现了问题。 这不是关于代码的事情。
问题是我用相同的用户名和不同的密码注册了两个用户。 然后当我尝试使用用户名和一个密码登录时,它发生了这个错误并停止了服务器。
因为在用户输入的用户名中查找密码存在尴尬的情况。 因为有两个密码相同的用户名。
以宇宙程序员的名义
就我而言,我忘记选择密码,因为在数据库中密码是 ((select: false))
此应用程序代码
const user = await User.findOne({email}).select("+password")
我忘了将 ((.select("+password"))) 附加到 findOne
我收到了这个错误; 错误:非法参数:字符串,未定义
和这个数据库代码
const User = new mongoose.Schema({
username:{
type:String,
required: [true,"نام کاربری ضروری است"]
},
email:{
type:String,
required: [true,"رایانامه ضروری است"],
unique: true,
match:[
/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{1,3})$/,
"لطفا یک رایانامه صحیح وارد کنید"
]
},
password:{
type:String,
required:[true,"رمز ضروری است"],
minlegth: 5,
select: false
}
})
就我而言,我使用的是箭头函数
userSchema.methods.comparePassword = async (enterdPassword) => {
return await bcrypt.compare(enterdPassword, this.password);
};
我转换为正常功能
userSchema.methods.comparePassword = async function (enterdPassword) {
return await bcrypt.compare(enterdPassword, this.password);
};
解决了这个问题
就我而言,我正在使用社交登录/注册。 当用户使用社交登录选项进行注册时,存储的密码值为“NULL”。
所以我只是添加了这个小检查:
comparePassword: function(password, user){
if (!user.password)
return false;
return bcrypt.compareSync(password, user.password);
}
在
“模型/user.js”
里面比较密码
module.exports.comparePassword = (candidatePassword, hash, callback) => {...)
添加此代码:
bcrypt.hash(candidatePassword, 10, (err, hash) => {
if(err) {
throw err;
}
bcrypt.compare(candidatePassword, hash, (err, isMatch) => {
if(err) {
throw err;
}
callback(null, isMatch);
});
});
在这里,我们从登录页面获取用户名和密码,并通过数据库中的用户名找到我们的用户,然后将其加密密码与用户输入的密码进行匹配
passport.use(new LocalStrategy(
(username,password,done)=> {
db.users.findOne({username: username},(err, user)=> {
if(err) return done(err);
if(!user) {
return done(null,false,{message: 'Incorrect Username'});
}
bcrypt.compare(password, user.password,(err,isMatch)=> {
if(err) return done(err);
if(isMatch) {
return done(null, user);
} else {
return done(null, false,{message: 'Incorrect Password'});
}
});
});
}
));
您也需要将 await 应用于盐和密码分配。
像这样,
const salt = await bcrypt.genSaltSync(10);
const password = await req.body.password;
您可以编写这样的代码:After this.findOne({ select: [].......})... 希望对您有所帮助
async validateUserPassword(loginDto: AuthLoginDto): Promise<User> { const { mobile, email, password } = loginDto; const user = await this.findOne({ select: ['id', 'email', 'mobile', 'password', 'salt', 'status', 'logged_at'], where: [ { mobile: mobile }, { email: email } ] }); if (user && await user.validatePassword(password)) { const logged_at = { logged_at: new Date() } await this.update({ id: user.id }, logged_at) return user; } else { return null; } } async validatePassword(password: string): Promise<boolean> { const hash = await bcrypt.hash(password, this.salt); return hash === this.password; }
在我自己的情况下,我只想检查旧密码是否与 Db 中的密码匹配但出现错误,这是我的代码如下:
changePassword = asyncHandler (async (req: IGetUserAuthInfoRequest, res: Response) => {
const user = await User.findById(req.user._id)
const {oldPassword, password} = req.body
if(!user) {
res.status(400)
throw new Error("User not found, please signup")
}
// Validate
if(!oldPassword || !password) {
res.status(400)
throw new Error("Please add old and new password")
}
// Check if old password matches password in DB
const passwordIsCorrect = await bcrypt.compare(oldPassword, user.password)
// Save new password
if(user && passwordIsCorrect) {
user.password = password
await user.save()
res.status(200).send("Password change successful")
} else {
res.status(400)
throw new Error("Old password is incorrect")
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.