我是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:
你的问题是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;