Error: Cannot read properties of undefined (reading 'admin')

Issue

Hi i am getting this error when i am trying to restructure the project as MVC. I am creating usecases in my models. So i am trying to get my structure like this: When a route is hit, it goes to the controller and then from the controller it looks up to the usecase.My index router file :

"use strict";
const express = require("express");
const router = express.Router();
const TodoTask = require("../models/entity/ToDoTask");
const {
  ensureAuthenticated,
  forwardAuthenticated,
} = require("../controller/authentication/index");

const { isAdmin } = require("../controller/authentication/adminAuthMiddleware");

const todos = require("../controller/todos/index");
const {
  getAllTodos,
  createTodo,
  getTodo,
  editTodo,
  deleteTodo,
} = require("../controller/todos/index");

// Welcome Page
router.get("/", forwardAuthenticated, (req, res) => res.render("landing"));
router.get("/dashboard", ensureAuthenticated, getAllTodos);
router.get("/admin-dashboard", ensureAuthenticated, getAllTodos);
router.post("/dashboard", createTodo);
router.route("/edit/:id").get(getTodo).post(editTodo);
router.route("/remove/:id").get(deleteTodo);

router.get("/admin-dashboard", isAdmin, (req, res) =>
  res.render("admin-dashboard")
);

module.exports = router;

I am creating a controller for getting all the todos

const TodoTask = require("../../models/entity/ToDoTask");
const TODOS = require("../../models/usecases/todo");
module.exports = {
getAllTodos: async () => {
try {
      console.log("in the controller");
      let todos = await TODOS.getAllTodos({});
      return todos;
    } catch (error) {
      console.error(error);
    }
  },

and the error that i am getting is in the usecase

const TodoTask = require("../../models/entity/ToDoTask");

const getAllTodos = async function (req, res) {
  if (req.user.admin === true) {
    TodoTask.find({}, (err, tasks) => {
      res.render("admin-dashboard.ejs", {
        todoTasks: tasks,
        user: req.user,
      });
    });
  } else {
    TodoTask.find({ "user.id": req.user._id }, (err, tasks) => {
      res.render("todo.ejs", {
        todoTasks: tasks,
        user: req.user,
      });
      console.log(tasks);
    });
  }
};

so i am getting error as ‘TypeError: Cannot read properties of undefined (reading ‘admin’) in models\usecases\todo.js
Please help

Solution

Modify your function getAllTodos with below code.
If the req object has user object and in further it has admin as true, it should work as expected.

const TodoTask = require("../../models/entity/ToDoTask");
const TODOS = require("../../models/usecases/todo");
module.exports = {
    getAllTodos: async (req, res) => {
    try {
          console.log("in the controller");
          let todos = await TODOS.getAllTodos(req, res);
          return todos;
        } catch (error) {
          console.error(error);
        }
     },
}

Edit:
Modify your function from todo as below,

const TodoTask = require("../../models/entity/ToDoTask");

const getAllTodos = async function (req, res) {
  if (req.user.admin === true) {
    TodoTask.find({}, (err, tasks) => {
      return res.render("admin-dashboard.ejs", {
        todoTasks: tasks,
        user: req.user,
      });
    });
  } else {
    TodoTask.find({ "user.id": req.user._id }, (err, tasks) => {
     return res.render("todo.ejs", {
        todoTasks: tasks,
        user: req.user,
      });
      console.log(tasks);
    });
  }
};

Answered By – Pradeep Yenkuwale

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published