简体   繁体   English

我如何使用ejs有条件地渲染导航栏

[英]How can i conditionally render the navbar using ejs

I wanna conditionally render the navbar using EJS I tried a few things but they did not work, my goal is to render another type of navbar if the user is logged in. 我想使用EJS有条件地渲染导航栏我尝试了一些但是它们没有用,我的目标是在用户登录时渲染另一种类型的导航栏。

I am posting a lot of codes but I do highly appreciated if you could take your time and help me, I do not think that all of the codes are even necessary tbh but I did not want to forget anything 我发布了很多代码,但我非常感谢你能抽出时间帮助我,我不认为所有的代码都是必要的,但我不想忘记任何事情

app.js app.js

require('dotenv').config({path: "node.env"});
const path = require('path');
const express = require('express');

const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const flash = require("connect-flash");

const session = require("express-session");
const MongoDBStore = require("connect-mongodb-session")(session);
const errorController = require('./controllers/error');

const mongodb_uri = process.env.MONGODB_URI;
const app = express();
const csrf = require("csurf");
const User = require("./models/user");

const store = new MongoDBStore({
    uri: mongodb_uri,
    collection: "sessions"
});

const csrfProtection = csrf();


app.set('view engine', 'ejs');
app.set('views', 'views');

const adminRoutes = require("./routes/admin");
const blogRoutes = require("./routes/blog");
const authRoutes = require("./routes/auth");


app.use(bodyParser.urlencoded({
    extended: true
}));

app.use(express.static(path.join(__dirname, 'public')));


app.use(
    session({
        secret: process.env.SECRET,
        cookie: {
            maxAge: 1000 * 60 * 60 * 24 * 7
        },
        store: store,
        resave: false,
        saveUninitialized: false,

    })
)

app.use(flash());
app.use(csrfProtection);

app.use((req, res, next) => {
    if (!req.session.user) {
        return next();
    }
    User.findById(req.session.user._id)
    .then(user => {
        if (!user) {
            return next();
        }
        req.user = user;
        next();
    })
    .catch(err => console.log(err));
})

app.use((req, res, next) => {
    res.locals.isauthenticated = req.session.isLoggedIn;
    res.locals.csrfToken = req.csrfToken();
    next();
});

app.use("/admin", adminRoutes);
app.use(blogRoutes);


app.use(errorController.get404);

mongoose.set('useCreateIndex', true);

mongoose.connect(mongodb_uri, {
    useNewUrlParser: true
});

app.listen(3000, function () {
    console.log("listening to port 3000")
})

navigation.ejs navigation.ejs

<% if (isAuthenticated) { %>

<ul>
    <li><a href="/posts">posts</a> </li>
    <li><a href="/myposts">myposts</a> </li>
    <li><a href="/createpost">createpost</a></li>
    <li>
        <form action="/logout" method="post">
            <input type="hidden" name="_csrf" value="<%= csrfToken %>">
            <button type="submit">Logout</button>
        </form>
    </li>
</ul>

<% } else { %>

<ul>
    <li><a href="/">home</a></li>
    <li><a href="/signup">signup</a></li>
    <li><a href="/login">login</a></li>
</ul>

<% } %>

adminjs controller adminjs控制器

const path = require('path');
const bcrypt = require("bcryptjs");
const User = require("../models/user");
const isAuthenticated = require("../middleware/is-auth");

exports.getMyPostsPage = (req, res) => {
    res.render("admin/myposts", {
        path: "/myposts",
        pageTitle: "myposts",
        isAuthenticated: isAuthenticated
    })
}

exports.getCreatepostPage = (req, res) => {
    res.render("admin/createpost", {
        path: "/createpost",
        pageTitle: "createpost",
        isAuthenticated: isAuthenticated
    });
}


exports.getPostsPage = (req, res) => {
    res.render("admin/posts", {
        path: "/posts",
        pageTitle: "posts",
        isAuthenticated: isAuthenticated
    });
}

auth.js auth.js

const path = require('path');
const bcrypt = require("bcryptjs");
const User = require("../models/user");



exports.postLogin = (req, res, next) => {
    const {
        username,
        password
    } = req.body;
    User.findOne({
            username: username
        })
        .then(user => {
            if (!user) {
                req.flash("error", "Invalid email or password.");
                return res.redirect("/login");
            }
            bcrypt
                .compare(password, user.password)
                .then(doMatch => {
                    if (doMatch) {
                        req.session.isLoggedIn = true;
                        req.session.user = user;
                        return req.sesson.save(err => {
                            console.log(err);
                            res.redirect("/");
                        });
                    }
                    req.flash("error", "invalid email or password.");
                    res.redirect("/login");
                })
                .catch(err => {
                    console.log(err);
                    res.redirect("/login");
                })
        })
        .catch(err => console.log);
}

exports.postLogout = (req, res, next) => {
    req.session.destroy(err => {
        console.log(err);
        res.redirect("/");
    })
}

exports.postSignup = (req, res, next) => {
    const {
        username,
        password
    } = req.body;
    User.findOne({
            username
        })
        .then(userDoc => {
            if (userDoc) {
                req.flash("error", "email exists already, please pick a different one.");
                return res.redirect("/signup")
            }
            return bcrypt
                .hash(password, 12)
                .then(hashedPassword => {
                    const user = new User({
                        username: username,
                        password: password
                    });
                    return user.save();
                })
                .then(result => {
                    res.redirect("/login");
                })
                .catch(err => {
                    console.log(err);
                })
        })
}

is auth middleware 是auth中间件

    if (!req.session.isLoggedIn) {
        return res.redirect('/login');
    }
    next();
}```


admin.js router 
```const path = require('path');

const express = require('express');

const adminController = require("../controllers/admin")

const router = express.Router();

const isAuth = require("../middleware/is-auth");



router.get("/posts", isAuth, adminController.getPostsPage);

router.get("/myposts", isAuth, adminController.getMyPostsPage);

router.get("/createpost", isAuth, adminController.getCreatepostPage);



module.exports = router;```


auth js routes 
```const path = require('path');

const express = require('express');

const authController = require("../controllers/auth");

const router = express.Router();




router.post("/signup", authController.postSignup);

router.post("/login", authController.postLogin);

router.post("/logout", authController.postLogout);


module.exports = router;```

This is solved! 这解决了! Good job Discord team :) 好工作Discord团队:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用 TypeScript 有条件地呈现 LitElement? - How can I conditionally render LitElement with TypeScript? EJS:如何从 EJS 文件中的猫鼬渲染两个或多个填充的集合 - EJS: How can I render two or more populated colletions from mongoose in EJS file 我可以在EJS中渲染多个源 - Can I render multiple sources in EJS 如何有条件地渲染两个 JSX 变量? - How can I render two JSX variables conditionally? 如何根据本地存储中是否有数据有条件地渲染这个组件? - How can I conditionally render this component based on whether or not there is data in localstorage? 如何根据路线有条件地呈现特定的html部分 - How can I conditionally render particular html sections depending on the Route 如何在 React 的初始加载时有条件地渲染不同的组件? - How can I conditionally render different components on initial load in React? Vue,如何根据路线渲染不同的导航栏? - Vue, how can I render different navbar due to route? 如何在 ejs 中有条件地包含视图? - How to include a view conditionally in ejs? 如何将不同的新闻组件呈现到导航栏组件中并在导航栏页面上显示它们的数据,点击导航栏菜单链接 - How can I render different news components into the Navbar Component & display their data on the Navbar page, On Click of Navbar menu links
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM