Я не уверен, правильно ли создается экземпляр, но моя модель кажется неопределенной. Вот как настраивается мой код:
db.js
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 + "/config.js")[env];
const db = {};
if (config.use_env_variable) {
var sequelize = new Sequelize(process.env[config.use_env_variable]);
} else {
var sequelize = new Sequelize(
config.database,
config.username,
config.password,
config
);
}
fs.readdirSync(path.join(__dirname, "models"))
.filter(function(file) {
return (
file.indexOf(".") !== 0 && file !== basename && file.slice(-3) === ".js"
);
})
.forEach(function(file) {
let model = sequelize["import"](path.join(__dirname, "models", file));
db[model.name] = model;
});
Object.keys(db).forEach(function(modelName) {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
sequelize
.authenticate()
.then(() => {
console.info(`Connection was successful!`);
})
.catch(err => {
console.info(`Unable to connect to database: ${err}`);
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = {
db
};
Manifest.js (в папке моделей)
"use strict";
module.exports = function(sequelize, DataTypes) {
let Manifest = sequelize.define("Manifest", {
manifestNumber: {
type: DataTypes.STRING(10),
primaryKey: true,
allowNull: false
},
huller: DataTypes.STRING(50),
address: DataTypes.STRING(50),
carrier: DataTypes.STRING(50),
driver: DataTypes.STRING(50),
dateShipped: DataTypes.DATE,
preparedBy: DataTypes.STRING(15),
recievedBy: DataTypes.STRING(15),
truckLicenseNumber: DataTypes.STRING(25),
frontTrailerLicenseNumber: DataTypes.STRING(25),
rearTrailerLicenseNUmber: DataTypes.STRING(25),
splitLoad: DataTypes.BOOLEAN,
tagNumber: DataTypes.STRING(50),
grossTotal: DataTypes.DECIMAL(18, 0),
netTotal: DataTypes.DECIMAL(18, 0),
totalBins: DataTypes.DECIMAL(18, 0),
phase: DataTypes.STRING(10),
shipments: DataTypes.INTEGER,
submitDate: {
type: DataTypes.DATEONLY,
defaultValue: DataTypes.NOW,
allowNull: false
}
});
return Manifest;
};
api.js (фрагмент)
const db = require("../db");
const express = require("express");
const router = express.Router();
router.post("/manifests/new", function(req, res) {
let manifest = req.body;
db.Manifest.max("manifestNumber")
.success(max => {
if (max) {
// Convert max to int, add 1, then post with new manifest
} else {
// Empty table so start with 1
}
})
.error(err => {
console.info(`Error querying max: ${err}`);
});
})
Я убедился, что имя файла точно соответствует тому, что определено в модели, но я не уверен, имеет ли это значение, когда мой db.js читает каталог моделей и добавляет его в переменную db. Может быть, мой код структурирован или я неправильно использую db, когда включаю его в свой api.js? Я знаю, что этот код правильно подключается к моему экземпляру SQL Server, но может ли эта модель правильно связываться с существующей таблицей? Или таблица в этот момент пуста? Этот нуб из Sequelize очень ценит любую помощь!
В Sequelize вам не нужно помещать все модели в переменную ...
Когда вы используете sequelize.import
автоматически, у вас будет sequelize.models
(массив всех моделей, импортированных из вашей папки модели) и функция sequelize.model
, и вы должны использовать что-то вроде этого: sequelize.model('Manifest')
db.js
const Sequelize = require('sequelize')
const fs = require('fs')
const path = require('path')
module.exports = ({ logger, config }) => {
config.db.logging = (
config.db.logging !== false
? query => logger.debug('[DATABASE]', query)
: false
)
const db = new Sequelize(config.db)
loadModels(db)
Object
.keys(db.models)
.forEach((model) => {
if ('associate' in db.model(model)) {
db.model(model).associate()
}
})
return db
}
// ===============================================
function loadModels (sequelize) {
const dir = path.join(__dirname, 'models')
fs.readdirSync(dir)
.forEach(
file => sequelize.import(path.join(dir, file))
)
}
У меня нет согласованности в моей функции loadModels
, потому что все файлы в папке модели должны экспортировать модель продолжения.
О твоей ошибке. Проверьте, действительно ли у вашего Object.keys(db)
есть ваши модели, потому что ваш readdirSync
кажется неправильным. Так что проверь это.
Итак, я закомментировал все в forEach (), зарегистрировал в консоли имя модели и получил Manifest. Кажется, по крайней мере, он получает правильное имя, но db [modelName] кажется пустым объектом. Кроме того, вы правы относительно лакомого кусочка согласованности, в учебнике, которому я следовал, он был в index.js в папке моделей, но я подумал, что могу просто сделать это в своем файле db.js.
@JulianToyaAngeles проверяет перед этим ... возможно, ваш sequelize.import по какой-то причине возвращает undefined.
На самом деле проблема заключалась просто в том, что я экспортировал db в объекте, а не только в нем. Изменение его на просто module.exports = db исправило его. Я такой глупый.