Вставьте имя пользователя в шаблоне js с express и node.js - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь вставить имя пользователя в макет, я использую e js на основе шаблонов с узлом и express. Я пробовал следующее:

Модель Mongodb:

const mongoose = require('mongoose')
const Schema = mongoose.Schema;
var uniqueValidator = require('mongoose-unique-validator')
const bcrypt = require('bcrypt')
const UserSchema = new Schema({
  username: {
    type: String,
    required: [true, 'Please provide username'],
    unique: true
  },
  password: {
    type: String,
    required: [true, 'Please provide password'],
  },
  dateRegistered: {
    type: Date,
    default: new Date()
  }
  //image: String
});

UserSchema.plugin(uniqueValidator);

//encrypt password
UserSchema.pre('save', function(next) {
  const user = this
  bcrypt.hash(user.password, 10, (error, hash) => {
    user.password = hash
    next()
  });
});

const User = mongoose.model('User', UserSchema);
module.exports = User

РЕДАКТИРОВАТЬ: логин. js:

module.exports = (req,res) =>{
  res.render('login')
}

РЕДАКТИРОВАТЬ: loginUser. js

const bcrypt = require('bcrypt')
const User = require('../models/User')

module.exports = (req, res) => {
  const {
    username,
    password
  } = req.body;

  User.findOne({
    username: username
  }, (error, user) => {
    if (user) {
      bcrypt.compare(password, user.password, (error, same) => {
        if (same) {
          req.session.userId = user._id
          res.redirect('/')
        } else {
          res.redirect('/auth/login')
        }
      })
    } else {
      res.redirect('/auth/login')
    }
  })
}

РЕДАКТИРОВАТЬ: authMiddleware. js:

const User = require('../models/User')

module.exports = (req, res, next) => {
    User.findById(req.session.userId, (error, user ) =>{
      if(error || !user )
        return res.redirect('/auth/login')

      next()
    })
}

РЕДАКТИРОВАТЬ: redirectIfAuthenticatedMiddleware. js

module.exports = (req, res, next) =>{
    if(req.session.userId){
      return res.redirect('/') // if user logged in, redirect to home page
    }
    next()
}

РЕДАКТИРОВАТЬ: индекс. js:

const loginController = require('./controllers/login')
const loginUserController = require('./controllers/loginUser')

app.get('/auth/login', redirectIfAuthenticatedMiddleware, loginController)
app.post('/users/login',redirectIfAuthenticatedMiddleware, loginUserController)

navbar.e js:

<% if(loggedIn) { %>
    <p> <%= username %> </p>
<% } %>

Результатом является пустой абзац без значения EDIT: добавлены маршруты, управляемые через контроллеры

1 Ответ

0 голосов
/ 18 апреля 2020

где ваша функция рендеринга? Вам необходимо передать переменную в шаблон. Для этого с E JS решение:

обработчик маршрутизатора

router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

на странице шаблона: index.e js

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
  </body>
</html>

так что в вашем случае это должно быть что-то вроде

router.get('/', function(req, res, next) {
  res.render('index', { 
      loggedIn: true
      username: res.locals.username 
  });
});

и что

<% if(loggedIn) { %>
    <p> <%= username %> </p>
<% } %>
...