【发布时间】:2021-01-12 14:07:42
【问题描述】:
当我重新启动 nodemon 时尝试重新填充我的数据库时,我遇到了 .create is not a function 错误。我以前有过这个工作,所有的表格都很好,我一直被标记为这个错误。我正在使用 Node、Express、Sequelize 和 Postgres pgAdmin4。
我读过类似的主题 a ; in node 可能会导致这样的错误,但我已经尝试了一些方法,仍然得到同样的错误。
//const Sequelize = require('sequelize')
const express = require("express");
const bodyParser = require ("body-parser");
// const { Sequelize, Op, Model, DataTypes } = require("sequelize");
// import authRoute from './server/routes/auth.routes';
// import postRoutes from './server/routes/diveLog.routes';
const cors = require("cors");
// creates an en express app
const app = express();
// set origin to 5002
// var corsOptions = {
// origin: "http://localhost:5002"
//}
// add bp and cors using api.use method
// parse requests of content type app/json
// app.use(cors(corsOptions));
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header(
'Access-Control-Allow-Headers',
'Origin, X-Requested-With, Content-Type, Accept',
);
next();
});
// parse requests of content-type
app.use(bodyParser.json());
//bp used to process form data as json
app.use(bodyParser.urlencoded({ extended: true }));
//database
const db = require("./server/models");
//const sequelize = require("pg");
const Role = db.userRole;
//const DivingSchool = db.approvedDivingSchool;
const Current = db.currentLevel;
const DiveType = db.diveType;
const DiveRegion = db.diveRegion;
const Visibility = db.visibilityLevel;
const DiveAgency = db.diveAgency;
const Certifications = db.diveCertification;
const MarineType = db.marineType;
//const user = db.userLogin;
try {
db.sequelize.authenticate();
console.log('Connection made to the database made.');
} catch (error) {
console.error('unable to connect:', error);
}
// db.sequelize.sync();
// force: true will drop the table if it already exists
db.sequelize.sync({ force: false })
.then(() => {
console.log(`Drop and resync database with { force: true }`)
initial()
});
// simple route
app.get('/', (req, res) => {
res.json({ message: "connected to the sustainable scuba database." });
});
// routes
require('./server/routes/auth.routes')(app);
require('./server/routes/user.routes')(app);
require('./server/routes/diveLog.routes')(app);
require('./server/routes/diveSchool.routes')(app);
// set port, listen for requests
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => {
console.log(`Server is now running on PORT ${PORT}.`);
});
function initial() {
Role.create({
userRoleID: 1,
userRoleName: "User"
});
Role.create({
userRoleID: 2,
userRoleName: "School"
});
Role.create({
userRoleID: 3,
userRoleName: "SiteAdmin"
});
Role.create({
userRoleID: 4,
userRoleName: "SuperUser"
});
}
错误信息:
Unhandled rejection TypeError: Role.create is not a function
at initial (C:\Users\James Greene\WebstormProjects\softwaredevproject\SustainableScuba\backend\server.js:86:11)
at C:\Users\James Greene\WebstormProjects\softwaredevproject\SustainableScuba\backend\server.js:63:5
at tryCatcher (C:\Users\James Greene\WebstormProjects\softwaredevproject\SustainableScuba\backend\node_modules\sequelize\node_modules\bluebird\js\relea
se\util.js:16:23)
at Promise._settlePromiseFromHandler (C:\Users\James Greene\WebstormProjects\softwaredevproject\SustainableScuba\backend\node_modules\sequelize\node_mo
dules\bluebird\js\release\promise.js:547:31)
at Promise._settlePromise (C:\Users\James Greene\WebstormProjects\softwaredevproject\SustainableScuba\backend\node_modules\sequelize\node_modules\blueb
ird\js\release\promise.js:604:18)
at Promise._settlePromise0 (C:\Users\James Greene\WebstormProjects\softwaredevproject\SustainableScuba\backend\node_modules\sequelize\node_modules\blue
bird\js\release\promise.js:649:10)
at Promise._settlePromises (C:\Users\James Greene\WebstormProjects\softwaredevproject\SustainableScuba\backend\node_modules\sequelize\node_modules\blue
bird\js\release\promise.js:729:18)
at _drainQueueStep (C:\Users\James Greene\WebstormProjects\softwaredevproject\SustainableScuba\backend\node_modules\sequelize\node_modules\bluebird\js\
release\async.js:93:12)
at _drainQueue (C:\Users\James Greene\WebstormProjects\softwaredevproject\SustainableScuba\backend\node_modules\sequelize\node_modules\bluebird\js\rele
ase\async.js:86:9)
at Async._drainQueues (C:\Users\James Greene\WebstormProjects\softwaredevproject\SustainableScuba\backend\node_modules\sequelize\node_modules\bluebird\
js\release\async.js:102:5)
at Immediate.Async.drainQueues [as _onImmediate] (C:\Users\James Greene\WebstormProjects\softwaredevproject\SustainableScuba\backend\node_modules\seque
lize\node_modules\bluebird\js\release\async.js:15:14)
at processImmediate (internal/timers.js:439:21)
index.js
const config = require("../../config/db.config.js");
const Sequelize = require("sequelize");
const sequelize = new Sequelize(
config.DB,
config.USER,
config.PASSWORD,
{
host: config.HOST,
dialect: config.dialect,
operatorsAliases: false,
//logging: (...msg) => console.log(msg),
pool: {
max: config.pool.max,
min: config.pool.min,
acquire: config.pool.acquire,
idle: config.pool.idle
}
}
);
const db = {};
db.Sequelize = Sequelize;
db.sequelize = sequelize;
db.userLogin = require("./userLogin.model")(sequelize, Sequelize);
db.userRole = require("./userRole.model")(sequelize, Sequelize);
db.diveLog = require("./diveLog.model.js")(sequelize, Sequelize);
db.visibilityLevel = require("./visibility.model.js")(sequelize, Sequelize);
db.diveType = require("./diveType.model.js")(sequelize, Sequelize);
db.currentLevel = require("./currentLevel.model.js")(sequelize, Sequelize);
db.approvedDivingSchool = require("./approvedDivingSchool.model.js")(sequelize, Sequelize);
db.diveRegion = require("./diveRegion.model.js")(sequelize, Sequelize);
db.diveAgency = require("./diveAgency.model")(sequelize, Sequelize);
db.diveCertification = require("./diveCertifications.model")(sequelize, Sequelize);
db.marineLife = require("./marineLife.model")(sequelize, Sequelize);
db.diveSpot = require("./diveLog.model")(sequelize, Sequelize);
db.article = require("./articles.model")(sequelize, Sequelize);
/* db.userRole.belongsTo(db.userLogin, {
through: "fk_userRoles",
foreignKey: "userRoleID",
otherKey: "userRole"
});
//db.userLogin.belongsTo(db.userRole, {
// through: "fk_userRoles",
// foreignKey: "userRole",
// otherKey: "userRoleID"
//});
db.diveLog.belongsTo(db.visibilityLevel, {
through: "fk_visibility",
foreignKey: "diveVisibilityID",
otherKey: "visibilityID"
});
//db.visibilityLevel.belongsTo(db.diveLog, {
// through: "fk_visibility",
// foreignKey: "visibilityID",
// otherKey: "diveVisibilityID"
//});
db.diveLog.belongsTo(db.currentLevel, {
through: "fk_current",
foreignKey: "diveCurrentID",
otherKey: "currentID"
});
db.currentLevel.belongsTo(db.diveLog, {
through: "fk_visibility",
foreignKey: "currentID",
otherKey: "diveCurrentID"
});
db.diveLog.belongsTo(db.approvedDivingSchool, {
through: "fk_divingSchool",
foreignKey: "diveSchoolNameID",
otherKey: "diveSchoolID"
});
db.approvedDivingSchool.belongsTo(db.diveLog, {
through: "fk_divingSchool",
foreignKey: "diveSchoolID",
otherKey: "diveSchoolNameID"
});
db.diveLog.belongsTo(db.diveType, {
through: "fk_diveType",
foreignKey: "diveTypeID",
otherKey: "diveTypeID"
});
db.diveType.belongsTo(db.diveLog, {
through: "fk_diveType",
foreignKey: "diveTypeID",
otherKey: "diveTypeID"
});
db.diveLog.belongsTo(db.userLogin, {
through: "fk_userID",
foreignKey: "diverUserNumber",
otherKey: "userID"
});
db.userLogin.belongsTo(db.diveLog, {
through: "fk_userID",
foreignKey: "userID",
otherKey: "diverUserNumber"
});
db.approvedDivingSchool.belongsTo(db.diveLocation, {
through: "fk_diveLocation",
foreignKey: "diveSchoolLocation",
otherKey: "diveLocationID"
});
db.diveLocation.belongsTo(db.approvedDivingSchool, {
through: "fk_diveLocation",
foreignKey: "diveLocationID",
otherKey: "diveSchoolLocation"
});
*/
db.userRole = ["User", "School", "SiteAdmin", "SuperUser"];
db.diveType = ["Recreational", "Training", "Night Dive", "Deep Dive", "Drift", "Wreck", "Cave", "Reef", "Photo", "Research"];
db.VisibilityLevel = ["Bad < 5 m>", "Average 5-10 m", "Good 10-25 m", "Excellent > 25 m"];
db.currentLevel = ["Light > 1 knot", "Medium 1-2 knots", "Strong 2-3 knots", "Extreme > 2 knots"];
db.diveRegion = ["Europe", "North America", "South America", "Africa", "Oceania", "Asia"];
db.userLogin = ["Dummy", "dummy", "dummy@dummy.com", "Dummy", "Dummy"];
db.diveAgency = ["PADI", "SSI", "NAUI", "SDI"];
db.marineType = ["Cephalopods, crustaceans & other shellfish", "Corals and other invertebrates", "Marine mammals", "Ocean fishes", "Sea Turtles & Reptiles", "Sharks and Rays", "Marine Science and Ecosystems"];
db.diveCertification = ["Open Water", "Open Water Adv", "Open Water Instructor", "Divemaster", "Divemaster", "Freediver Basic", "Freediver Adv", "Freediver Instructor", "Freediver Master", "Dive Theory", "Digital Underwater Photographer", "Underwater Videographer", "Deep Diver", "Night Diver", "Ice Diver", "Cavern Diver", "Sus Scub Aware Campaign", "Sus Scub Aware Instructor", "Sus Scub Shark Conservation", "Dive Against Debris Speciality"];
module.exports = db;
【问题讨论】:
-
似乎在
db.userRole = ["User", "School", "SiteAdmin", "SuperUser"];行中,您正在覆盖之前在db.userRole = require("./userRole.model")(sequelize, Sequelize);中声明为模型的db.userRole定义 -
干杯,让它工作。它之前使用索引文件中的条目对其进行了初始化,但由于某种原因不允许它第二次进行。
标签: javascript node.js express sequelize.js