提供的代码包含 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);
这是代码的修改版本,按照您描述的方式结合了身份验证和 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);