e.T55
e.T55

Reputation: 465

findOne is not a function

I am trying to create a model using Sequelize and mysql db.I am trying to post to '/students/register' it keeps giving me an error saying findOne is not a function. I tried requiring my sql but it's not working ..I also tried a different function like findAll and still not working.what seems to be the problem

const Sequelize = require('sequelize');
module.exports = function (sequelize, Sequelize) {
    const Stundet = sequelize.define(
        'student', {
            id: {
                type: Sequelize.INTEGER,
                primaryKey: true,
                autoIncrement: true
            },
            name: {
                type: Sequelize.STRING
            },
            email: {
                type: Sequelize.STRING
            },
            password: {
                type: Sequelize.STRING
            },
            created: {
                type: Sequelize.DATE,
                defaultValue: Sequelize.NOW
            }
        }, {
            timestamps: false
        });
    module.exports = Stundet;

}

routes

const Student_Info = require("../models/students")

student.post('/register', (req, res) => {
    const dataToday = new Date()
    const studentData = {
        name: req.body.name,
        email: req.body.email,
        password: req.body.password,
        created: dataToday
    }
    Student_Info.findOne({
            where: {
                email: req.body.email
            }
        })
        .then(student => {
            if (!student) {
                bcrypt.hash(req.body.password, 10, (err, hash) => {
                    studentData.password = hash
                    Student_Info.create(studentData)
                        .then(student => {
                            res.json({
                                status: student.email + 'registered'
                            })
                        })
                        .catch(err => {
                            res.send('error' + err)
                        })
                })

            } else {
                res.json({
                    error: 'Student already registered'
                })
            }
        })
        .catch(err => {
            res.send('error' + err)
        })
})
module.exports = student;

Upvotes: 0

Views: 1392

Answers (2)

Lajne
Lajne

Reputation: 82

When you use module.exports, you should return Stundet. You already export the whole function. And I think you should pass DataTypes instead of Sequelize.

Something like this:

module.exports = function (sequelize, DataTypes) {
    const Stundet = sequelize.define(
        //...
    return Stundet;

}

So in your route in order to use your model:

const Sequelize = require('sequelize');
const DataTypes = sequelize.DataTypes;

let sequelize = new Sequelize(...);

const Student = require('../models/students')(sequelize, DataTypes);

Upvotes: 1

KenOn10
KenOn10

Reputation: 1968

I suspect that your Student_Info is null. Does you application successfully connect to the database? It helps to log... e.g.

sequelizeDB
  .authenticate()
  .then(() => {
        console.log('Yes! DB Connection);
        ...
    })
    .catch(err => {
        console.error('No! Unable to connect to DB', err);
    });

... and IMHO the code reads better when you name the DB instance something other than "sequelize".

Upvotes: 0

Related Questions