Thursday, 18 May 2017

Sequelize - Cannot read property 'list' of undefined

Im just learn to use sequelize for my node.js project. For summary my project is ExpressJS+Typescript with Sequelize as ORM and Webpack as module bundler.

Below is my project structure.

src
-router
-server
--config
   config.json
--controllers
   index.ts
   User.ts
--migrations
--models
   index.js
   user.js
--seeders
 App.ts
 index.ts

(sorry can not post picture yet, new user to stackoverflow)

I have build some simple router '/user' and expect it should call the user controller and call sequelize method findAll() from my models module, but the result is its error says Cannot read property 'list' of undefined. Below is my code: models/index.js

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(module.filename);
const env = process.env.NODE_ENV || 'development';
const config = require(`${__dirname}/../config/config.json`)[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable]);
} else {
  sequelize = new Sequelize(
    config.database, config.username, config.password, config
  );
}

fs
  .readdirSync(__dirname)
  .filter(file =>
    (file.indexOf('.') !== 0) &&
    (file !== basename) &&
    (file.slice(-3) === '.js'))
  .forEach(file => {
    const model = sequelize.import(path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

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

export default db;

models/user.js

export default function(sequelize, DataTypes) {
  var user = sequelize.define('user', {
    username: DataTypes.STRING,
    name: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING,
    phone: DataTypes.STRING,
    wallet: DataTypes.DECIMAL
  }, {
    classMethods: {
      associate: function(models) {
        // associations can be defined here
        user.hasMany(models.top_up);
      }
    }
  });
  return user;
};

controllers/User.ts

let user = require('../models').user;

export default {
    list(req, res) {
        return user
        .findAll()
        .then(topUp => res.status(200).send(topUp))
        .catch(error => res.status(400).send(error));
    }
};

controllers/Index.ts

import users from './User'

export default {
    users
}

router/router.ts

import * as express from 'express';

const userController = require('../server/controllers').users;

// Init express router
let router = express.Router();

// Setting API URL
router.get('/', (req, res, next) => {
    res.json({
        message: 'Hello World!'
    });
});

router.get('/about',(req, res, next) => {
    res.send('<p>This is about about</p>');
});

router.get('/user', userController.list());

export default router

Fyi, all of my project configuration for start express server, typescript compile and webpack bundle is fine already, and the other route for '/' and '/about' is work fine. I know there is something I'm missing, im still new to sequelize, thanks for help.



via kola

No comments:

Post a Comment