SEQUELIZE: hasMany不是一个函数。

问题描述 投票:1回答:1

我是Sequelize的新手,当我运行我的应用程序并同步我的表时,我得到了下一个错误。

TypeError: UserModel.hasMany is not a function
    at Object.<anonymous> (/home/josecarlos/Workspace/nodejs/remote-roofing/src/server/models/users.js:46:11)
    at Module._compile (internal/modules/cjs/loader.js:816:30)
    at Module._compile (/home/josecarlos/Workspace/nodejs/remote-roofing/node_modules/pirates/lib/index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:827:10)
    at Object.newLoader [as .js] (/home/josecarlos/Workspace/nodejs/remote-roofing/node_modules/pirates/lib/index.js:104:7)

我只有两个表,所以我定义了两个模型。每个模型都有一个,并尝试在它们之间建立关系。

用户.js

import ProjectModel from "./projects";

const UserModel = (sequelize, type) => {
    return sequelize.define("user", {
        id: {
            type: type.INTEGER,
            primaryKey: true,
            autoIncrement: true,
            allowNull: false,
        },
        email: {
            type: type.STRING,
            allowNull: false,
            isEmail: {
                msg: "The format of the e-mail is not correct"
            },
            validate: {
                notNull: {
                    msg: "E-mail cannot be empty"
                }
            }
        },
        name: {
            type: type.STRING,
            is: /^[a-zA-Z ]+$/i,
            allowNull: false,
            validate: {
                notNull: {
                    msg: "Name cannot be empty"
                }
            }
        },
        surname: {
            type: type.STRING,
            is: /^[a-zA-Z ]+$/i,
            allowNull: false,
            validate: {
                notNull: {
                    msg: "Surname cannot be empty"
                }
            }
        }
    })
};

UserModel.hasMany(ProjectModel, { foreingKey: "userID", sourceKey: "id"});
ProjectModel.belongsTo(UserModel, { foreingKey: "userID", sourceKey: "id"});

module.exports.UserModel = UserModel;

项目.js

import UserModel from "./users";

const ProjectModel = (sequelize, type) => {
    return sequelize.define("project", {
        id: {
            type: type.INTEGER,
            primaryKey: true,
            autoIncrement: true,
            allowNull: false,
        },
        name: {
            type: type.STRING,
            is: /^[a-zA-Z ]+$/i,
            allowNull: false,
            validate: {
                notNull: {
                    msg: "Name cannot be empty"
                }
            }
        },
        body: {
            type: type.TEXT,
            allowNull: false,
            validate: {
                notNull: {
                    msg: "Body cannot be empty"
                }
            }
        },
        status: {
            type: type.ENUM("active", "inactive", "declined", "completed"),
            allowNull: false,
            validate: {
                notNull: {
                    msg: "Status cannot be empty"
                }
            }
        },
        userID: {
            type: type.INTEGER,
            allowNull: false,
            validate: {
                notNull: {
                    msg: "userID cannot be empty"
                }
            }
        }
    })
};

module.exports.ProjectModel = ProjectModel;

这两个模型是由db.js创建的。

import Sequelize from "sequelize";
import UserModel from "./models/users";
import ProjectModel from "./models/projects";
//It's mandatory to import dotenv in each file where we can use enviroment variables
import config from "dotenv";
config.config(); 

const sequelize = new Sequelize(process.env.DDBB_NAME, process.env.DDBB_USER,process.env.DDBB_PSWD, {
        host: process.env.DDBB_HOST, 
        port: process.env.DDBB_PORT,
        define: {
            //freezeTableName: true, /**Don't add 's to the end of each table/model */
            //timestamps: false,  /**Don't add fields createdAt and updatedAt */          
        },
        dialect: "postgres",
        pool: {
            max: 5,
            min: 0,
            acquire: 30000,
            idle: 10000
        }
    }
);


const User = UserModel(sequelize, Sequelize);
const Project = ProjectModel(sequelize, Sequelize);

sequelize.sync({force: false}).then(() => {
    console.log("Tables syncronized!!!")
})

module.exports = {
    User,
    Project
};

当我运行应用程序时需要这个文件。而且我得到了我之前显示的错误。

我到底做错了什么?

编辑一

我修改了db. js文件,但它对我来说没有用。我已经得到了同样的错误。我不知道如何被调用的模型:(((((

import Sequelize from "sequelize";
import UserModel from "./models/users";
import ProjectModel from "./models/projects";
import fs from "fs";
import path from "path";
//It's mandatory to import dotenv in each file where we can use enviroment variables
import config from "dotenv";
config.config(); 

const sequelize = new Sequelize(process.env.DDBB_NAME, process.env.DDBB_USER,process.env.DDBB_PSWD, {
        host: process.env.DDBB_HOST, 
        port: process.env.DDBB_PORT,
        define: {
            //freezeTableName: true, /**Don't add 's to the end of each table/model */
            //timestamps: false,  /**Don't add fields createdAt and updatedAt */          
        },
        dialect: "postgres",
        pool: {
            max: 5,
            min: 0,
            acquire: 30000,
            idle: 10000
        }
    }
);

let db = {
    sequelize,
    Sequelize,
    models: {}
}

//Register Models
const models = path.join(__dirname, "models");
fs
  .readdirSync(models)
  .filter(function (file) {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js')
  })
  .forEach(function (file) {
    var model = sequelize['import'](path.join(models, file))
    db[model.name] = model
  })

Object.keys(db).forEach(function (modelName) {
  if (db[modelName].associate) {
    db[modelName].associate(db)
  }
})


db.sequelize.sync({force: false}).then(() => {
    console.log("Tables syncronized!!!")
})

module.exports.db = db;

编辑二

现在,我已经得到了这个错误。

/home/josecarlos/Workspace/nodejs/remote-roofing/src/server/models/users.js:9
var UserModel = _db["default"].sequelize.define("user", {
                                         ^

TypeError: Cannot read property 'define' of undefined
    at Object.<anonymous> (/home/josecarlos/Workspace/nodejs/remote-roofing/src/server/models/users.js:4:32)

db. js

import Sequelize from "sequelize";
import UserModel from "./models/users";
import ProjectModel from "./models/projects";
import fs from "fs";
import path from "path";
//It's mandatory to import dotenv in each file where we can use enviroment variables
import config from "dotenv";
config.config(); 

const sequelize = new Sequelize(process.env.DDBB_NAME, process.env.DDBB_USER,process.env.DDBB_PSWD, {
        host: process.env.DDBB_HOST, 
        port: process.env.DDBB_PORT,
        define: {
            //freezeTableName: true, /**Don't add 's to the end of each table/model */
            //timestamps: false,  /**Don't add fields createdAt and updatedAt */          
        },
        dialect: "postgres",
        pool: {
            max: 5,
            min: 0,
            acquire: 30000,
            idle: 10000
        }
    }
);

let db = {
    sequelize: sequelize,
    Sequelize: Sequelize,
    models: {}
}

//Register Models
const models = path.join(__dirname, "models");
fs
  .readdirSync(models)
  .filter(function (file) {
      console.log("file: " + file);
    return (file.indexOf('.') !== 0) && (file.slice(-3) === '.js')
  })
  .forEach(function (file) {
    var model = sequelize['import'](path.join(models, file))
    db[model.name] = model
  })

Object.keys(db).forEach(function (modelName) {
  if (db[modelName].associate) {
    db[modelName].associate(db)
  }
})


db.sequelize.sync({force: false}).then(() => {
    console.log("Tables syncronized!!!")
})

module.exports.db = db;

user.js

import Sequelize from "sequelize";
import db from "../db";

const UserModel = db.sequelize.define("user", {
    id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        allowNull: false,
    },
    email: {
        type: Sequelize.STRING,
        allowNull: false,
        isEmail: {
            msg: "The format of the e-mail is not correct"
        },
        validate: {
            notNull: {
                msg: "E-mail cannot be empty"
            }
        }
    },
    name: {
        type: Sequelize.STRING,
        is: /^[a-zA-Z ]+$/i,
        allowNull: false,
        validate: {
            notNull: {
                msg: "Name cannot be empty"
            }
        }
    },
    surname: {
        type: Sequelize.STRING,
        is: /^[a-zA-Z ]+$/i,
        allowNull: false,
        validate: {
            notNull: {
                msg: "Surname cannot be empty"
            }
        }
    }
})

UserModel.associate = (models) => {
    UserModel.hasMany(models.ProjectModel, {
        foreignKey: "userID"
    })
}

module.exports.UserModel = UserModel;

项目.js

import Sequelize from "sequelize";
import db from "../db";

const ProjectModel = db.sequelize.define("project", {
    id: {
        type: type.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        allowNull: false,
    },
    name: {
        type: type.STRING,
        is: /^[a-zA-Z ]+$/i,
        allowNull: false,
        validate: {
            notNull: {
                msg: "Name cannot be empty"
            }
        }
    },
    body: {
        type: type.TEXT,
        allowNull: false,
        validate: {
            notNull: {
                msg: "Body cannot be empty"
            }
        }
    },
    status: {
        type: type.ENUM("active", "inactive", "declined", "completed"),
        allowNull: false,
        validate: {
            notNull: {
                msg: "Status cannot be empty"
            }
        }
    },
    userID: {
        type: type.INTEGER,
        allowNull: false,
        validate: {
            notNull: {
                msg: "userID cannot be empty"
            }
        }
    }
});


ProjectModel.associate = (models) => {
    ProjectModel.belongsTo(models.UserModel, {
        foreignKey: "userID"
    })
}

module.exports.ProjectModel = ProjectModel;

对不起,但我什么都不懂......:((

编辑三:我已经检查了user.js中的db键。

我检查了user.js中db的键,什么都没有,所以我的错误是正确的,但是... ... 为什么db什么都没有?

[nodemon] starting `babel-node src/server/server.js`
db: 
node.js postgresql sequelize.js
1个回答
0
投票

你的问题是user.js中的UserModel是作为一个函数返回一个sequalize定义。

在同一个文件中,你试图在返回模型对象的函数上调用UserModel.hasMany,而不是模型对象本身。

你可能只是想删除封装函数,并直接将sequalize对象分配给UserModel。

const UserModel = sequelize.define("user", {
...

或者把对UserModel的调用移到函数中。

    const model = sequelize.define("user", {
    ...
    });
    model.hasMany(ProjectModel, { foreingKey: "userID", sourceKey: "id"});
    model.belongsTo(UserModel, { foreingKey: "userID", sourceKey: "id"});
    return model;
};
module.exports.UserModel = UserModel;
© www.soinside.com 2019 - 2024. All rights reserved.