Dognation, cannot get /login

Hi,

Although it felt fairly straightforward working through the exercises I’m now stuck with the Dognation project in the authentication module of the full stack engineer course, namely it log that the user has been found but the page shows a ‘Cannot GET /login’ message.

Have had a look at similar forum questions and blocks of code and tried it in Chrome with third-party cookies allowed and received the same message.

Very grateful for any help if anyone can spot anything. Thanks!

My code below.

App.js:

// Import packages const express = require("express"); const app = express(); const session = require("express-session"); const passport = require("passport"); // App config app.set("trust proxy", 1); const PORT = process.env.PORT || 4001; app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use(express.static(__dirname + '/public')); app.set("view engine", "ejs"); // Import Passport config require("./config/passport"); // Session Config const store = new session.MemoryStore(); app.use( session({ secret: "wysywysysy", cookie: { maxAge: 420000000, secure: true, sameSite: 'none',}, saveUninitialized: false, resave: false, store }) ); // Passport Config app.use(passport.initialize()); app.use(passport.session()); // Routes app.use(require("./routes/index.routes")); app.get("/", (req, res) => { const user = req.user || "Guest"; res.render("home", { user }); }); app.listen(PORT, () => { console.log(`Server is listening on port: ${PORT}`); });

users.routes.js:

const express = require("express"); const router = express.Router(); const helper = require("../helpers/helper"); const passport = require("passport"); const filename = "./data/users.json"; const bcrypt = require("bcrypt"); let users = require("../data/users.json"); // Register New User: router.post("/register", async (req, res) => { const { username, password } = req.body; const id = { id: helper.getNewId(users) }; try { const user = await helper.userExists(username); if (user) { console.log("User already exists!"); return res.redirect("login"); } // Hash password before storing in local DB: const salt = await bcrypt.genSalt(10); const hashedPassword = await bcrypt.hash(password, salt); const newUser = { ...id, username, password: password }; // Store new user in local DB await users.push(newUser); await helper.writeJSONFile(filename, users); res.redirect("login"); } catch (err) { res.status(500).json({ message: err.message }); } }); // Log In User: router.post( "/login", passport.authenticate("local", { failureRedirect: "/login" }), (req, res) => { res.redirect("profile"); } ); // Log out user: router.get("/logout", (req, res) => { req.logout(); res.redirect("/login"); }); router.get("/register", (req, res) => { res.render("register"); }); router.get("/login", (req, res) => { res.render("login"); }); module.exports = router;

passport.js:

const passport = require("passport"); const LocalStrategy = require("passport-local").Strategy; const bcrypt = require("bcrypt"); const helper = require("../helpers/helper"); // Set up the Passport strategy: passport.use( new LocalStrategy(function (username, password, done) { helper.findByUsername(username, async function (err, user) { if (err) { return done(err); } if (!user) { return done(null, false); } const matchedPassword = await bcrypt.compare(password, user.password); if (!matchedPassword) { return done(null, false); } return done(null, user); }); }) ); // Serialize a user passport.serializeUser((user, done) => { done(null, user.id); }); // Deserialize a user passport.deserializeUser((id, done) => { helper.findById(id, function (err, user) { if (err) { return done(err); } done(null, user); }); });

I noticed a few small things that could be your issue…

Firstly, in your users.routes.js file on line 22 you are correctly creating a hashedPassword variable, but in the newUser object you are not assigning as the value to password.

Second, on line 40 you are redirecting to “profile”, but this route doesn’t actually exist. Try redirecting to “/” and see if this helps at all.

Third, on line 47 of the “/logout” route you are redirecting to the “/login” route, but it might be nicer to just redirect back to the home route there “/”, putting users back at the beginning.

The rest of your code looks like it should be fine. I hope these things can help you out, I was stuck on this as well after the exercises and when I made these changes in my code it worked as expected and I was able to create an account, login, and then logout from the home page. Happy Coding :call_me_hand: