SoftwareBrothers / adminjs

AdminJS is an admin panel for apps written in node.js
https://adminjs.co
MIT License
8.21k stars 661 forks source link

Getting TypeError: Cannot read property 'name' of undefined when using admin-bro-sequelizejs #158

Closed davidnge closed 5 years ago

davidnge commented 5 years ago

I ran into an error while following the tutorial for sequelizejs.

Everything works until I get to the Passing an entire database section.

Here's my set up:

// models/index.js

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');

const db = {}

const sequelize = new Sequelize('RFEdb', 'root', 'root', {
    host: 'localhost',
    dialect: 'sqlite',
    pool: {
      max: 10,
      min: 0,
      acquire: 30000,
      idle: 10000
    },
    storage: './rfe.sqlite'
  })

fs
    .readdirSync(__dirname)
    .filter((file) =>{
        file !== "index.js"
    }) 
    .forEach((file) => {
        const model = sequelize.import(path.join(__dirname, file))
        db[model.name] = model
    })

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = {
    sequelize,
    db
  }

// routers/admin.route.js

const AdminBro = require('admin-bro')
const AdminBroExpress = require('admin-bro-expressjs')
const AdminBroSequelize = require('admin-bro-sequelizejs')

const { sequelize, db } = require('../../models');

AdminBro.registerAdapter(AdminBroSequelize)

const adminBro = new AdminBro({
    databases: [sequelize],
    rootPath: '/admin'
  })

const router = AdminBroExpress.buildRouter(adminBro)

module.exports = router

// app.js

const express = require('express');
const app = express();
const adminRouter = require('./routers/admin.router');
const { sequelize, db } = require('../../models');

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

sequelize.sync()
    .then(()=>{
        app.listen(process.env.PORT || 8081);
        console.log(`server started listening on port 8081`)
    })

When I visit http://localhost:8081/admin I'm getting the following error:

(node:20970) [DEP0079] DeprecationWarning: Custom inspection function on Objects via .inspect() is deprecated
TypeError: Cannot read property 'name' of undefined
    at ResourceDecorator.getParent (/Users/davidnge/Desktop/remote-frontend/node_modules/admin-bro/lib/backend/decorators/resource-decorator.js:166:25)
    at ResourceDecorator.toJSON (/Users/davidnge/Desktop/remote-frontend/node_modules/admin-bro/lib/backend/decorators/resource-decorator.js:305:20)
    at store.dispatch.admin.resources.map.r (/Users/davidnge/Desktop/remote-frontend/node_modules/admin-bro/lib/frontend/store/index.js:18:27)
    at Array.map (<anonymous>)
    at initializeStore (/Users/davidnge/Desktop/remote-frontend/node_modules/admin-bro/lib/frontend/store/index.js:16:66)
    at html (/Users/davidnge/Desktop/remote-frontend/node_modules/admin-bro/lib/frontend/layout-template.js:41:36)
    at AppController.index (/Users/davidnge/Desktop/remote-frontend/node_modules/admin-bro/lib/backend/controllers/app-controller.js:14:12)
    at handler (/Users/davidnge/Desktop/remote-frontend/node_modules/admin-bro-expressjs/plugin.js:56:52)
    at Layer.handle [as handle_request] (/Users/davidnge/Desktop/remote-frontend/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/davidnge/Desktop/remote-frontend/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/Users/davidnge/Desktop/remote-frontend/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/Users/davidnge/Desktop/remote-frontend/node_modules/express/lib/router/layer.js:95:5)
    at /Users/davidnge/Desktop/remote-frontend/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/Users/davidnge/Desktop/remote-frontend/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/davidnge/Desktop/remote-frontend/node_modules/express/lib/router/index.js:275:10)
    at urlencodedParser (/Users/davidnge/Desktop/remote-frontend/node_modules/body-parser/lib/types/urlencoded.js:91:7)
    at Layer.handle [as handle_request] (/Users/davidnge/Desktop/remote-frontend/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/davidnge/Desktop/remote-frontend/node_modules/express/lib/router/index.js:317:13)
    at /Users/davidnge/Desktop/remote-frontend/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/davidnge/Desktop/remote-frontend/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/davidnge/Desktop/remote-frontend/node_modules/express/lib/router/index.js:275:10)
    at jsonParser (/Users/davidnge/Desktop/remote-frontend/node_modules/body-parser/lib/types/json.js:110:7)

I tried replacing sequelize with db for the databases option but the error still remain. Am I following the tutorial wrong or did I miss something?

Appreciate your help, thanks.

wojtek-krysiak commented 5 years ago

Hi,

in admin.route.js try to require seqlelize like this:

const models = require('../../models'); // no spread syntax

and then pass it like this:

const adminBro = new AdminBro({
    databases: [models],
    rootPath: '/admin'
  })
davidnge commented 5 years ago

Hey,

Thanks for replying. I just tried it, but it's the exact same error.

davidnge commented 5 years ago

Hi,

I tried loading the resource one by one instead like:

// routers/admin.route.js

const AdminBro = require('admin-bro')
const AdminBroExpress = require('admin-bro-expressjs')
const AdminBroSequelize = require('admin-bro-sequelizejs')

const db = require('../../models');

AdminBro.registerAdapter(AdminBroSequelize)

const adminBro = new AdminBro({
    //databases: [db],
    resources: [
      {
        resource: db.Job, options: {} // I have job.js under /models
      }
    ],
    rootPath: '/admin'
  })

const router = AdminBroExpress.buildRouter(adminBro)

module.exports = router

In the end I'm still getting the exact same error as https://github.com/SoftwareBrothers/admin-bro/issues/158#issue-500966264.

I'm using sqlite as my db though, does this affect anything?

wojtek-krysiak commented 5 years ago

most probably it's sqlite thing - we tested it with postgress and mysql. I Adding this to TODO

davidnge commented 5 years ago

Sure. And as you said, it's working as expected after I switched to postgresql.