Мой рабочий процесс должен выглядеть следующим образом:
Реестры пользователей> Затем перенаправляется на страницу входа (информация пользователя сохраняется в БД вместе с сгенерированным ключом API)
Как только пользователь зарегистрирован, он перенаправляется на страницу входа в систему.
Он входит в систему, затем отображается его панель управления. Панель инструментов показывает их информацию, а также ключ API.
Проблема, с которой я сталкиваюсь, заключается в том, что при вводе информации о пользователе ничего не происходит (она реагирует так, как если бы она взяла информацию). Страница обновляется, информация о пользователе не заполняется в БД, и console.log
ничего не показывает.
Мой код: сервер. js
require('dotenv').config()
const express = require('express') ;
const app = express();
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const flash = require('req-flash');
const session = require('express-session');
const passport = require('passport');
mongoose.connect(process.env.DATABASE_URL, { useNewUrlParser: true , useUnifiedTopology: true })
const db = mongoose.connection
db.on('error', (error) => console.error(error))
db.once('open', () => console.log('Connected to Database'))
app.use(express.json());
app.set('view-engine', 'ejs');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({ secret: 'Test123' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
const articlesRouter = require('./routes/articles')
app.use('/articles', articlesRouter)
const userRouter = require('./routes/users')
app.use('/register', userRouter)
app.use(express.urlencoded({ extended: false }))
app.get('/', (req, res) => {
//res.render('index.ejs')
res.redirect('/login');
})
app.get('/login', (req, res) => {
res.render('login.ejs')
})
const pagesRouter = require('./routes/pages');
app.use('/dashboard', pagesRouter);
app.get('/register', (req, res) => {
res.render('register.ejs')
})
app.listen(3000, () => console.log('Server Started'))
маршруты пользователя. js :
const express = require('express');
const router = express.Router();
const Users = require('../models/users');
const UsersConstroller = require('../controllers/users.controller');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const uuidv4 = require('uuid/v4');
var expressValidator = require('express-validator');
const flash = require('req-flash');
router.use(expressValidator());
//Register - POST
router.post('/', (req, res) => {
var firstName = req.body.firstName;
var lastName = req.body.lastName;
var email = req.body.email;
var password = req.body.password;
//validations
req.checkBody('firstName', 'Your First Name is Required').notEmpty();
req.checkBody('lastName', 'Your Last Name is Required').notEmpty();
req.checkBody('email', 'A valid email is required').isEmail();
req.checkBody('password', 'An Account Passowrd Is Required').notEmpty();
var errors = req.validationErrors();
if (errors) {
res.render('register.ejs', {
errors:errors
});
} else {
const randomKey = uuidv4();
var newUser = new Users({
firstName: firstName,
lastName: lastName,
email: email,
password: password,
apiKey: randomKey.replace(/-/g,'')
});
newUser.save(function(err, user) {
if(err) throw(err);
console.log(user);
});
req.flash('success_message', "You are now registered!");
res.redirect('/login');
}
});
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
},
function(email, password, done){
UsersConstroller.getUserByEmail(email, function(err, _user){
if(err) throw err;
if(!_user){
return done(null, false, {message: 'Unknown Email Address'});
}
const ismatch = _user.validPassword(password, _user.password);
if(ismatch){
return done (null, _user);
} else {
return done(null, false, {message: 'Invalid Passowrd'});
}
});
}));
passport.serializeUser(function(user, done){
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
UsersConstroller.getUserById(id, function(err, user) {
done(err, user)
});
});
router.post('/login', passport.authenticate('local', {
successRedirect: '/dashboard',
failureRedirect: '/login',
session:true,
successFlash: 'Welcome',
failureFlash: 'Invalid Email or Passowrd!'
}), function(req, res) {
res.redirect('/');
});
/*router.post('/login', function(req, res) {
passport.authenticate('local', function(err, user, info) {
if (err) {
return next(err);
}else if (!user) {
return res.redirect('/login');
}else{
res.cookie('api_key', user.apiKey);
return res.redirect('/dashboard');
}
});
});*/
router.get('/logout', function(req, res) {
req.logout();
req.flash('Success_message', 'You are now logged out!')
res.redirect('/');
});
module.exports = router
пользователей модели. js
const mongoose = require('mongoose')
const bcrypt = require('bcrypt')
var userSchema = new mongoose.Schema({
firstName: String,
lastName: String,
email: String,
password: String,
permissionLevel: Number,
created: Date,
apiKey: String
});
userSchema.methods.generateHash = function(cb) {
this.password = bcrypt.hashSync(this.password, bcrypt.genSaltSync(10), cb);
return cb();
};
userSchema.methods.validPassword = function(password, hash) {
return bcrypt.compareSync(password, hash);
};
userSchema.post("save", function(_doc, next) {
_doc.password = undefined;
return next();
});
userSchema.pre("save", function(next) {
this.generateHash(next);
});
module.exports = mongoose.model('User', userSchema);
Я подозреваю, что это как-то связано с моей коллекцией пользователей, в которую я пытаюсь внести данные. Его кодируется только в модели пользователей, и нигде больше. Но я не уверен.
Любая помощь будет принята с благодарностью.