身份验证和 URL 缩短器 Node js 应用程序问题

问题描述 投票:0回答:1

提供的代码包含 2 个独立的应用程序。我想要做的是构建一个应用程序,在应用程序运行时首先加载登录页面,然后在成功验证后,它将用户重定向到 index.ejs 页面。加载 index.ejs 页面时,我希望应用程序运行 url-shortener 部分。我对 Node js 还很陌生,但仍然想完成这个应用程序。我将不胜感激任何帮助。 谢谢!

if (process.env.NODE_ENV !== "production") {
  require("dotenv").config();
}

const express = require("express");
const app = express();

const bcrypt = require("bcrypt");
const passport = require("passport");
const initializePassport = require("./passport");

const flash = require("express-flash");
const session = require("express-session");

initializePassport(
  passport,
  (email) => users.find((user) => user.email === email),
  (id) => users.find((user) => user.id === id)
);

const users = [];

app.use(express.urlencoded({ extended: false }));
app.use(flash());
app.use(
  session({
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false,
  })
);
app.use(passport.initialize());
app.use(passport.session());

app.set("view engine", "ejs");

// route for login page
app.get("/login", (req, res) => {
  res.render("login.ejs");
});

// route for register page
app.get("/register", (req, res) => {
  res.render("register.ejs");
});

// login post
app.post(
  "/login",
  passport.authenticate("local", {
    successRedirect: "/index.ejs",
    failureRedirect: "/login",
    failureFlash: true,
  })
);
// register post
app.post("/register", async (req, res) => {
  try {
    const hashedPassword = await bcrypt.hash(req.body.password, 10);
    users.push({
      id: Date.now().toString(),
      name: req.body.name,
      email: req.body.email,
      password: hashedPassword,
    });
    res.redirect("/login");
  } catch (e) {
    console.log(e);
    res.redirect("/register");
  }
});

// route for home page
app.get("/index", (req, res) => {
  res.render("index.ejs");
});

//url shortenr
const mongoose = require("mongoose");
const ShortUrl = require("./models/shortUrl");

mongoose.connect("mongodb://localhost/urlShortener", {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

app.use(express.urlencoded({ extended: false }));

app.get("/", async (req, res) => {
  const shortUrls = await ShortUrl.find();
  res.render("index", { shortUrls: shortUrls });
});

app.post("/shortUrls", async (req, res) => {
  await ShortUrl.create({ full: req.body.fullUrl });

  res.redirect("/");
});

app.get("/:shortUrl", async (req, res) => {
  const shortUrl = await ShortUrl.findOne({ short: req.params.shortUrl });
  if (shortUrl == null) return res.sendStatus(404);

  shortUrl.save();

  res.redirect(shortUrl.full);
});

app.listen(3000);

javascript node.js authentication url ejs
1个回答
0
投票

这是代码的修改版本,按照您描述的方式结合了身份验证和 URL 缩短:

if (process.env.NODE_ENV !== "production") {


require("dotenv").config();
}

const express = require("express");
const app = express();

const bcrypt = require("bcrypt");
const passport = require("passport");
const initializePassport = require("./passport");

const flash = require("express-flash");
const session = require("express-session");

initializePassport(
  passport,
  (email) => users.find((user) => user.email === email),
  (id) => users.find((user) => user.id === id)
);

const users = [];

app.use(express.urlencoded({ extended: false }));
app.use(flash());
app.use(
  session({
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false,
  })
);
app.use(passport.initialize());
app.use(passport.session());

app.set("view engine", "ejs");

// route for login page
app.get("/login", (req, res) => {
  res.render("login.ejs");
});

// route for register page
app.get("/register", (req, res) => {
  res.render("register.ejs");
});

// login post
app.post(
  "/login",
  passport.authenticate("local", {
    successRedirect: "/index", // Redirect to index after successful login
    failureRedirect: "/login",
    failureFlash: true,
  })
);

// register post
app.post("/register", async (req, res) => {
  try {
    const hashedPassword = await bcrypt.hash(req.body.password, 10);
    users.push({
      id: Date.now().toString(),
      name: req.body.name,
      email: req.body.email,
      password: hashedPassword,
    });
    res.redirect("/login");
  } catch (e) {
    console.log(e);
    res.redirect("/register");
  }
});

// Middleware to ensure the user is authenticated before accessing /index
function isAuthenticated(req, res, next) {
  if (req.isAuthenticated()) {
    return next();
  }
  res.redirect("/login");
}

// route for home page (index.ejs)
app.get("/index", isAuthenticated, (req, res) => {
  res.render("index.ejs");
});

// URL shortener routes
const mongoose = require("mongoose");
const ShortUrl = require("./models/shortUrl");

mongoose.connect("mongodb://localhost/urlShortener", {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

app.get("/", async (req, res) => {
  const shortUrls = await ShortUrl.find();
  res.render("index", { shortUrls: shortUrls });
});

app.post("/shortUrls", async (req, res) => {
  await ShortUrl.create({ full: req.body.fullUrl });
  res.redirect("/");
});

app.get("/:shortUrl", async (req, res) => {
  const shortUrl = await ShortUrl.findOne({ short: req.params.shortUrl });
  if (shortUrl == null) return res.sendStatus(404);

  shortUrl.save();

  res.redirect(shortUrl.full);
});

app.listen(3000);
© www.soinside.com 2019 - 2024. All rights reserved.