【问题标题】:Sequelize TypeError: Cannot read property 'max' of undefinedSequelize TypeError:无法读取未定义的属性“最大值”
【发布时间】:2018-08-21 21:29:10
【问题描述】:

我不确定实例是否未正确创建,但我的模型似乎未定义。这是我的代码的设置方式:

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.log(`Connection was successful!`);
  })
  .catch(err => {
    console.log(`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 (sn-p)

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.log(`Error querying max: ${err}`);
    });
})

我确保文件名与模型中定义的完全匹配,但我不确定当我的 db.js 读取模型目录并将其添加到 db 变量时这是否重要。可能是我的代码的结构方式,或者当我将它包含在我的 api.js 中时我误用了 db?我知道此代码正确连接到我的 SQL Server 实例,但可能是此模型未正确链接到现有表吗?或者此时桌子恰好是空的?这个 Sequelize noob 非常感谢任何和所有的帮助!

【问题讨论】:

  • 实际上,问题只是我在一个对象中导出了 db 而不仅仅是它本身。将其更改为仅 module.exports = db 修复了它。傻我。

标签: javascript node.js express sequelize.js


【解决方案1】:

在 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() 中的所有内容,控制台记录了 modelName 并获取 Manifest。它似乎至少得到了正确的名称,但 db[modelName] 似乎是一个空对象。另外,关于一致性的花絮你是对的,我遵循的教程将它放在模型文件夹中的 index.js 中,但我认为我可以在我的 db.js 文件中执行它。
  • @JulianToyaAngeles 在此之前检查...也许您的 sequelize.import 由于某种原因返回 undefined。
猜你喜欢
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 2019-10-22
  • 2016-01-10
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多