Express Sequelize错误-无法读取未定义的属性'findAll'

时间:2019-12-30 06:19:01

标签: postgresql express sequelize.js

我已使用Sequelize的github示例进行了一些更改,成功连接了Sequelize和Express。我现在正在尝试做一个简单的Sequelize查询来测试连接,但是继续收到一条错误消息,指出未定义我查询的模型。

// ./models/index.js
...
const sequelize = new Sequelize(process.env.DB, process.env.DB_USER, process.env.DB_PASS, {
  host: 'localhost',
  dialect: 'postgres'
});
// Test SEQUELIZE connection
sequelize
  .authenticate()
  .then(() => {
    console.log('Database connection has been established successfully.');
  })
  .catch(err => {
    console.error('Unable to connect to the database:', err);
  });

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

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
// ./routes/index.js
const models = require('../models');
const express = require('express');
const router = express.Router();

router.get('/contacts', (req, res) => {
    models.Contact.findAll().then(contacts => {
        console.log("All users:", JSON.stringify(contacts, null, 4));
    });
});


module.exports = router;
// ./models/contact.js
const Sequelize = require('sequelize');
var Model = Sequelize.Model;

module.exports = (sequelize, DataTypes) => {
    class Contact extends Model {}
    Contact.init({
      // attributes
      firstName: {
        type: Sequelize.STRING,
        allowNull: false
      },
      lastName: {
        type: Sequelize.STRING,
        allowNull: false
      }
    }, {
      sequelize,
      modelName: 'contact'
      // options
    });
    return Contact;
};

使用邮递员通过GET请求打/contacts时遇到的错误是:

[nodemon] starting `node server.js`
The server is now running on port 3000!
Executing (default): SELECT 1+1 AS result
Database connection has been established successfully.
TypeError: Cannot read property 'findAll' of undefined
    at router.get (C:\Users\username\desktop\metropolis\metropolis-backend\routes\index.js:6:20)

1 个答案:

答案 0 :(得分:0)

您没有正确要求模型。 在./routes/index.js中添加下一行:

const Contact = require('./models/contact.js');

然后致电Contact.findAll()...

第二种方法:

您可以通过将所有模型导入到loader.js文件中来收集所有模型,该文件将存储在models目录中。该模块的整个工作是将模块一起导入到同一位置,然后从一个位置导出它们。 看起来像这样:

// loader.js
const modelA = require('./modelA');
const modelB = require('./modelB');
const modelC = require('./modelC');
...

module.exports = {
 modelA,
 modelB,
 modelC,
 ...
}

然后您可以通过以下方式要求它:

router/index.js中:

const Models = require('./models');
const contact = Models.Contact;