I wanted to create log/register site w/ Node.JS & MongoDB , but have an issue with MongoDb , when i am trying to push data to MongoDB collection. It's very confusing for me , other files like login.ejs i didnt use here yet , because cant solve this one. Register.ejs is i guess correct , because i can see data by
console.log(newUser)
and it gives me like`
{ name: 'Aikyn', email: '[email protected]', password: 'asasdasdas', _id: new ObjectId("6357e652ccd077b202597632"), date: 2022-10-25T13:36:18.581Z }
if (process.env.NODE_ENV !== 'production') {
require('dotenv').config()
}
const User = require('./models/User')
const mongoose = require('mongoose')
const express = require('express');
const expressLayouts = require('express-ejs-layouts')
const app = express()
const bcrypt = require('bcrypt')
const flash = require('express-flash')
const session = require('express-session')
const passport = require('passport')
const initializePassport = require('./passport-config');
app.use(express.urlencoded({extended: false}))
app.use(express.static('public'));
app.use('/css', express.static(__dirname 'public/css'))
app.set('view-engine', 'ejs')
app.use(flash())
app.use(session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false
}))
app.use(passport.initialize())
app.use(passport.session())
app.get('/',(req,res) => {
res.render('index.ejs')
})
app.get('/login', (req,res) => {
res.render('login.ejs')
})
app.get('/register' , (req,res) => {
res.render('register.ejs')
})
app.post('/register', async(req,res) => {
let errors = []
const {name, email,password } = req.body
try {
if (!name || !email || !password) {
errors.push({msg: 'Please fill in all fields'})
}
if (password.length < 6) {
errors.push({msg: 'Password should be at least 6 charaacters'})
}
if (errors.length > 0) {
res.render('register', {
errors,
name,
email,
password
})
} else {
User.findOne({email:email})
.then(user => {
if (user) {
errors.push({msg: "Email already exists"})
console.log('Email already exists')
res.render('register', {
errors,
name,
email,
password
})
} else {
const newUser = new User({
name,
email,
password
})
console.log(newUser)
res.send('hello')
}
});
}
} catch {
res.redirect('/register')
}
})
app.post('/login', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login',
failureFlash: true
}))
mongoose.connect(process.env.DATABASE_URL, {useNewUrlParser: true})
const db = mongoose.connection
db.on('error', error => console.error(error))
db.once('open', () => console.log('Connected succesfully to Mongoose'))
app.listen(process.env.PORT || 3000)
This is part of code, when i created a new schema for MongoDB, i guess there shouldnt be any problem
const mongoose = require('mongoose')
const UserSchema = new mongoose.Schema({
name: {
type: String,
required: true
},
email: {
type: String,
required: true
},
password: {
type: String,
required: true
},
date: {
type: Date,
default: Date.now
}
})
const User = mongoose.model('User', UserSchema)
module.exports = User
And this register.ejs
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login</title>
<link rel="stylesheet" href="css/register.css">
<style>
@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,500;0,700;1,400&display=swap');
</style>
<script src="https://kit.fontawesome.com/c95d1b22db.js" crossorigin="anonymous"></script>
</head>
<body>
<div >
<div >
<form action="/register" method="POST">
<div >
<span >Registraion page</span>
</div>
<div >
<input placeholder="Name" type="text" name="name">
</div>
<div >
<input placeholder="Email"type="email" name="email" required>
</div>
<div >
<input placeholder="Password" type="password" name="password" required>
</div>
<button type="submit">Register</button>
</form>
<div >
<a>Already have an account?</a>
<a href="/login">Log In</a>
</div>
</div>
</div>
</body>
</html>
I tried to change some refers , i thought may be problem was there and also tried to create collection in MongoDB by myself , but nothing helped. I will be very thankful if u can find an issue in my code and reason why i cant push data to MongoDB
CodePudding user response:
I didn't check all the syntaxe but i think you forgot to save the new document you create, like this :
User.findOne({email:email})
.then(user => {
if (user) {
errors.push({msg: "Email already exists"})
console.log('Email already exists')
res.render('register', {
errors,
name,
email,
password
})
} else {
const newUser = new User({
name,
email,
password
})
newUser.save function (err) {
if (!err) {
console.log(newUser)
res.send('hello')
}
}
});
}
you can check on the mongoose documentation : https://mongoosejs.com/docs/models.html#constructing-documents