I am using sequelizejs with expressjs app.
here is the code of my user model.
user.js
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define('User', {
first_name: DataTypes.STRING,
last_name: DataTypes.STRING,
bio: DataTypes.STRING,
email: DataTypes.STRING,
profile_picture: DataTypes.STRING
}, {
classMethods: {
associate: function(models) {
// associations can be defined here
}
}
}, {
tableName: 'users'
});
return User;
};
Here is my user controller
userComponent.js
const express = require( 'express' )
const router = express.Router()
const User = require( '../../models/user' )
router.get( '/user', ( req, res, next ) => {
User.findAll()
.then( userResponse => {
res.status( 200 ).json( userResponse )
} )
.catch( error => {
res.status( 400 ).send( error )
} )
} )
module.exports = router
But when i am trying to get the data it throws this errors:
TypeError: User.findAll is not a function at router.get (D:\StateBoard-Project\v2\components\user\userComponent.js:6:8) at Layer.handle [as handle_request] (D:\StateBoard-Project\v2\node_modules\express\lib\router\layer.js:95:5) at next (D:\StateBoard-Project\v2\node_modules\express\lib\router\route.js:137:13) at Route.dispatch (D:\StateBoard-Project\v2\node_modules\express\lib\router\route.js:112:3) at Layer.handle [as handle_request] (D:\StateBoard-Project\v2\node_modules\express\lib\router\layer.js:95:5) at D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:281:22 at Function.process_params (D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:335:12) at next (D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:275:10) at Function.handle (D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:174:3) at router (D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:47:12)
Here is the model/index.js file which has been auto generated by Sequelize.
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 + '/..\database.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( function( file ) {
return ( file.indexOf( '.' ) !== 0 ) && ( file !== basename ) && ( file.slice( -3 ) === '.js' )
} )
.forEach( function( file ) {
var model = sequelize[ 'import' ]( path.join( __dirname, file ) )
db[ model.name ] = model
});
Object.keys( db ).forEach( function( modelName ) {
if ( db[ modelName ].associate ) {
db[ modelName ].associate( db )
}
});
db.sequelize = sequelize
db.Sequelize = Sequelize
module.exports = db
What is missing here?
I am using sequelizejs with expressjs app.
here is the code of my user model.
user.js
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define('User', {
first_name: DataTypes.STRING,
last_name: DataTypes.STRING,
bio: DataTypes.STRING,
email: DataTypes.STRING,
profile_picture: DataTypes.STRING
}, {
classMethods: {
associate: function(models) {
// associations can be defined here
}
}
}, {
tableName: 'users'
});
return User;
};
Here is my user controller
userComponent.js
const express = require( 'express' )
const router = express.Router()
const User = require( '../../models/user' )
router.get( '/user', ( req, res, next ) => {
User.findAll()
.then( userResponse => {
res.status( 200 ).json( userResponse )
} )
.catch( error => {
res.status( 400 ).send( error )
} )
} )
module.exports = router
But when i am trying to get the data it throws this errors:
TypeError: User.findAll is not a function at router.get (D:\StateBoard-Project\v2\components\user\userComponent.js:6:8) at Layer.handle [as handle_request] (D:\StateBoard-Project\v2\node_modules\express\lib\router\layer.js:95:5) at next (D:\StateBoard-Project\v2\node_modules\express\lib\router\route.js:137:13) at Route.dispatch (D:\StateBoard-Project\v2\node_modules\express\lib\router\route.js:112:3) at Layer.handle [as handle_request] (D:\StateBoard-Project\v2\node_modules\express\lib\router\layer.js:95:5) at D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:281:22 at Function.process_params (D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:335:12) at next (D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:275:10) at Function.handle (D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:174:3) at router (D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:47:12)
Here is the model/index.js file which has been auto generated by Sequelize.
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 + '/..\database.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( function( file ) {
return ( file.indexOf( '.' ) !== 0 ) && ( file !== basename ) && ( file.slice( -3 ) === '.js' )
} )
.forEach( function( file ) {
var model = sequelize[ 'import' ]( path.join( __dirname, file ) )
db[ model.name ] = model
});
Object.keys( db ).forEach( function( modelName ) {
if ( db[ modelName ].associate ) {
db[ modelName ].associate( db )
}
});
db.sequelize = sequelize
db.Sequelize = Sequelize
module.exports = db
What is missing here?
Share Improve this question edited May 27, 2017 at 17:18 rakibtg asked May 27, 2017 at 16:06 rakibtgrakibtg 5,91112 gold badges52 silver badges76 bronze badges3 Answers
Reset to default 15You should require models/index.js where you're going to use models, not models/user.js.
const models = require( '../../models/index');
router.get( '/user', ( req, res, next ) => {
models.User.findAll()
.then( userResponse => {
res.status( 200 ).json( userResponse )
})
.catch( error => {
res.status( 400 ).send( error )
})
} )
Your user.js file is exporting a function but you never instantiated it.
module.exports = function(sequelize, DataTypes) { // <-- function
When you require it
const User = require('../../models/user')
Now User
is a reference to that function. Where does it get sequelize
and DataTypes
from?
you should import your user model file.
eg. const user = require('../model/user');