Пожалуйста, кто-нибудь может взглянуть на эти строки кода ... Одна работает, а другая не будет работать. Я пытаюсь выяснить причину, почему. в одном случае в модели есть объект username для пользователей. в то время как в другом есть имя объекта в отличие от имени пользователя. У каждой модели есть свой телефонный объект. Таким образом, в первом случае пользователь настроен для входа с телефоном и паролем.
В этом случае сервер возвращает ошибку неверного запроса. Пожалуйста, смотрите код ниже
//routes/User.js
const express = require('express');
const userRouter = express.Router();
const passport = require('passport');
const passportConfig = require('../passport');
const JWT = require('jsonwebtoken');
const User = require('../models/User');
const Todo = require('../models/Transaction');
const signToken = userID =>{
return JWT.sign({
iss : "comparelight",
sub : userID
},"comparelight",{expiresIn : "1h"});
}
userRouter.post('/register',(req,res)=>{
const { phone,password,name, role, disco, meter, email } = req.body;
User.findOne({phone},(err,user)=>{
if(err)
res.status(500).json({message : {msgBody : "Error has occured", msgError: true}});
if(user)
res.status(400).json({message : {msgBody : "Username is already taken", msgError: true}});
else{
const newUser = new User({phone,password,name, role, disco, meter, email});
newUser.save(err=>{
if(err)
res.status(500).json({message : {msgBody : "Error has occured", msgError: true}});
else
res.status(201).json({message : {msgBody : "Account successfully created", msgError: false}});
});
}
});
<!-- begin snippet: js hide: false console: true babel: false -->
// passport.js
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const JwtStrategy = require('passport-jwt').Strategy;
const User = require('./models/User');
const cookieExtractor = req =>{
let token = null;
if(req && req.cookies){
token = req.cookies["access_token"];
}
return token;
}
// authorization
passport.use(new JwtStrategy({
jwtFromRequest : cookieExtractor,
secretOrKey : "comparelight"
},(payload,done)=>{
User.findById({_id : payload.sub},(err,user)=>{
if(err)
return done(err,false);
if(user)
return done(null,user);
else
return done(null,false);
});
}));
// authenticated local strategy using phone and password
passport.use(new LocalStrategy((phone,password,done)=>{
User.findOne({phone},(err,user)=>{
// something went wrong with database
if(err)
return done(err);
// if no user exist
if(!user)
return done(null,false);
// check if password is correct
user.comparePassword(password,done);
});
}));
Но в другом случае пользователь настроен на вход с именем пользователя и паролем. И это работает. Пожалуйста, смотрите код ниже.
//routes/User.js
const express = require('express');
const userRouter = express.Router();
const passport = require('passport');
const passportConfig = require('../passport');
const JWT = require('jsonwebtoken');
const User = require('../models/User');
const Todo = require('../models/Transaction');
const signToken = userID =>{
return JWT.sign({
iss : "comparelight",
sub : userID
},"comparelight",{expiresIn : "1h"});
}
userRouter.post('/register',(req,res)=>{
const { username,password,phone, role, disco, meter, email } = req.body;
User.findOne({username},(err,user)=>{
if(err)
res.status(500).json({message : {msgBody : "Error has occured", msgError: true}});
if(user)
res.status(400).json({message : {msgBody : "Username is already taken", msgError: true}});
else{
const newUser = new User({phone,password,username, role, disco, meter, email});
newUser.save(err=>{
if(err)
res.status(500).json({message : {msgBody : "Error has occured", msgError: true}});
else
res.status(201).json({message : {msgBody : "Account successfully created", msgError: false}});
});
}
});
});
userRouter.post('/login',passport.authenticate('local',{session : false}),(req,res)=>{
if(req.isAuthenticated()){
const {_id,username,role} = req.user;
const token = signToken(_id);
res.cookie('access_token',token,{httpOnly: true, sameSite:true});
res.status(200).json({isAuthenticated : true,user : {username,role}});
}
});
// passport.js
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const JwtStrategy = require('passport-jwt').Strategy;
const User = require('./models/User');
const cookieExtractor = req =>{
let token = null;
if(req && req.cookies){
token = req.cookies["access_token"];
}
return token;
}
// authorization
passport.use(new JwtStrategy({
jwtFromRequest : cookieExtractor,
secretOrKey : "comparelight"
},(payload,done)=>{
User.findById({_id : payload.sub},(err,user)=>{
if(err)
return done(err,false);
if(user)
return done(null,user);
else
return done(null,false);
});
}));
// authenticated local strategy using username and password
passport.use(new LocalStrategy((username,password,done)=>{
User.findOne({username},(err,user)=>{
// something went wrong with database
if(err)
return done(err);
// if no user exist
if(!user)
return done(null,false);
// check if password is correct
user.comparePassword(password,done);
});
}));
Спасибо.