[英]NodeJS unable to import Sequelize.js model (ES6)
我正在使用 Express 和 Sequeulize 运行 NodeJS,并且我有一个文件controllers/rooms.js
从models/room.js
导入 Room 。
import Room from '../models'
export function list(req, res) {
return Room
.findAll()
.then((rooms) => res.status(200).send(rooms))
.catch((error) => res.status(400).send(error))
}
下面是models/room.js
(同目录下还有sequelize-cli生成的index.js
文件)
'use strict'
export default (sequelize, DataTypes) => {
const Room = sequelize.define('Room', {
name: DataTypes.STRING
})
return Room
}
我有一个路线app.get('/rooms', list)
,但是当我访问这条路线时,我收到了这个错误:
TypeError: _models2.default.findAll is not a function
at list (/Users/matis/Documents/apps/node-docker-test/app/database/controllers/rooms.js:21:10)
at Layer.handle [as handle_request] (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/layer.js:95:5)
at /Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/index.js:335:12)
at next (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/index.js:275:10)
at expressInit (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/middleware/init.js:40:5)
at Layer.handle [as handle_request] (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/index.js:317:13)
at /Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/index.js:335:12)
at next (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/index.js:275:10)
at query (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/middleware/query.js:45:5)
at Layer.handle [as handle_request] (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/index.js:317:13)
at /Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/index.js:335:12)
at next (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/index.js:275:10)
at Function.handle (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/router/index.js:174:3)
at Function.handle (/Users/matis/Documents/apps/node-docker-test/node_modules/express/lib/application.js:174:10)
我确定我的导入/导出搞砸了,但我不知道怎么办。
models/index.js
文件如下
'use strict'
import { readdirSync } from 'fs'
import { basename as _basename, join } from 'path'
import Sequelize from 'sequelize'
const basename = _basename(__filename)
const env = process.env.NODE_ENV || 'development'
const config = require(__dirname + '/../config/config.json')[env]
const db = {}
let sequelize
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config)
} else {
sequelize = new Sequelize(config.database, config.username, config.password, config)
}
readdirSync(__dirname)
.filter(file => {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js')
})
.forEach(file => {
const model = sequelize['import'](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
export default db
当我这样称呼它时它起作用: return Room.Room.findAll()...
因此我可以将导入重命名为: import models from '../models'
并以这种方式调用它: return models.Room.findAll()...
但是,为什么我不能将其称为return Room.findAll()...
,导入应该如何制定??
假设您有使用 ES6 导入的 babel 设置,您可以尝试这种方法在 ES6 中导出 Sequelize 模型。
//数据库配置文件
import Sequelize from 'sequelize'; export const sequelize = new Sequelize( config.database.name, config.database.user, config.database.password, { host: config.database.host, dialect: config.database.dialect, pool: config.database.pool, operatorsAliases: false } );
// 模型
import Sequelize from 'sequelize'; import { sequelize } from '../database/db'; const User = sequelize.define( 'table_name', { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true }, name: { type: Sequelize.STRING, allowNull: false }, email: { type: Sequelize.STRING, allowNull: false }, password: { type: Sequelize.STRING, allowNull: false } }, { freezeTableName: true } ); export default User;
上次我使用 Sequelize 时,它在 ES6 特性上运行不佳。 我的猜测是,由于export default
, models/room.js
没有正确导出模型。 您可以尝试将该行更改为旧样式module.exports
;
export default (sequelize, DataTypes) => {
.....
To
.....
module.exports = (sequelize, DataTypes) => {
看看是否能解决导入问题。
在控制器中导入时,您可以这样做;
const Room = require('../models').Room;
这是进行导入的旧方法,现在您的代码应该可以工作了。 :)
如果您想尝试使用 ES6,您可以执行以下操作;
import {Room} from '../models'
我不确定这个 ES6 导入在这里是否有效!
我试图设置现有代码并面临上述问题。 通过将我的节点版本从最新版本降级到 10.18.0,问题得到了解决。
似乎代码最初是使用节点版本 10 开发的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.