快速续集错误 - 无法读取未定义的属性'findAll'



我已经使用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:Usersusernamedesktopmetropolismetropolis-backendroutesindex.js:6:20)

您不需要正确使用模型。 在./routes/index.js中添加下一行:

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

然后打电话给Contact.findAll()...

第二种方法:

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

// 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;

相关内容