javascript 如何使用EJS在我的视图中使用MySql表?我无法识别错误

x4shl7ld  于 2022-12-10  发布在  Java
关注(0)|答案(2)|浏览(119)

当我尝试使用我的EJS页面中的数据时,它给出了以下错误:

TypeError: C:\Users\ygor\Documents\VS Code\Digital House\PI-DevNap\src\views\user.ejs:22
    20|                 <a class='photo' href="#"><img src="/images/camera-change.png" alt="Câmera"></a>
    21|                 <div class="hello-user">
 >> 22|                     <h3>Olá <%= user.name %>
    23|
    24|                     </h3>
    25|                     <h6>

这是有问题的控制器代码:

index: async (req, res) => {
  
      const user = await req.user;
  
      if (user) {
        return res.redirect('/account');
      }
  
      return res.render('user', { user } )
    },

这是会话创建代码:

login: (req, res) => {
      const { email, password, remember } = req.body
      const hasToRemember = !!remember;
      
      const user = users.find(user => user.email === email)
    
      if (!user) {
        return res.render('login', {
          error: 'Username or password incorrect.'
        })
      }
  
      if (!bcrypt.compareSync(password, user.password)) {
        return res.render('user', {
          error: 'Username or password incorrect.'
        })
      }
  
      req.session.email = user.email;
      
      if (hasToRemember) {
        res.cookie('user', user.email, { maxAge: 5000 });
      }
      
      res.redirect('/account')
    },

路由器:

router.get('/', cookie, usersController.index)

MySQL数据库:(https://i.stack.imgur.com/BsJxw.png
迁移:

module.exports = {
  async up (queryInterface, Sequelize) {
    await queryInterface.createTable('users', {
      id: {
        type: Sequelize.INTEGER,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true
      },
      name: {
        type: Sequelize.STRING,
        allowNull: false
      },
      email: {
        type: Sequelize.STRING(100),
        allowNull: false,
        unique: true
      },
      password: {
        type: Sequelize.STRING(1000),
        allowNull: false
      }
    })
  },

  async down (queryInterface, Sequelize) {
    await queryInterface.dropTable('users')
  }

中间件(cookie):

const getInfoDatabase = require('../utils/getInfoDatabase')

const users = getInfoDatabase('users')

function cookie(req, res, next) {
  const email = req.cookies.user || req.session.email;

  if (Boolean(email)) {
    const userSession = users.find(user => user.email === email)
    req.user = userSession
  }

  return next()
}

module.exports = cookie

EJS代码:

<body>
    <%- include('partials/header') %>
    <main>
        <h2 class="myaccount">MINHA CONTA</h2>
        <section class="account-infos">
            
            <div class="history">
                <a class='photo' href="#"><img src="/images/camera-change.png" alt="Câmera"></a>
                <div class="hello-user">
                    <h3>Olá <%= user.name %>
                        
                    </h3>

我希望它能捕获

const user = await req.user;
  
      if (user) {
        return res.redirect('/account');
      }
  
      return res.render('user', { user } )

但我认为这是不可能的
对不起,如果这已经回答过,这是我的第一个问题,我还没有找到一个解决方案,看看其他线程。

dgiusagp

dgiusagp1#

用户在EJS页面中显示为undefined,因此要解决这个问题,只需实现以下代码。

index: async (req, res) => {
  const user = await req.user;
  
  if (user) {
    return res.redirect('/account');
  }

  // Pass the user object to the EJS page
  return res.render('user', { user } )
},
w8ntj3qf

w8ntj3qf2#

好了,修改完这个之后,我已经理解了我在以前的awnser中的错误。基本上看起来这个问题是与传递到EJS视图的用户对象有关的。用户对象没有定义,所以当EJS视图试图访问用户的name属性时,它会失败并返回一个TypeError。要修复这个问题,你可以只确保用户对象被定义并且有一个name属性。2例如:

login: (req, res) => {
  const { email, password, remember } = req.body;
  const hasToRemember = !!remember;

  const user = users.find(user => user.email === email);

  if (!user) {
    return res.render('login', {
      error: 'Username or password incorrect.'
    });
  }

  if (!bcrypt.compareSync(password, user.password)) {
    return res.render('user', {
      error: 'Username or password incorrect.'
    });
  }

  req.session.email = user.email;
  req.user = user; // <-- set the user object on the request

  if (hasToRemember) {
    res.cookie('user', user.email, { maxAge: 5000 });
  }

  res.redirect('/account');
},

这样,当控制器中的索引方法试图访问请求中的用户对象时,它将被定义并具有EJS视图所需的属性。
希望这对你有帮助!

相关问题