Node.js NodeJS无法导入Sequelize.js模型(ES6)
我正在用Express和Sequelize运行NodeJS,我有一个文件Node.js NodeJS无法导入Sequelize.js模型(ES6),node.js,express,ecmascript-6,sequelize.js,Node.js,Express,Ecmascript 6,Sequelize.js,我正在用Express和Sequelize运行NodeJS,我有一个文件controllers/rooms.js从models/rooms.js导入房间 import Room from '../models' export function list(req, res) { return Room .findAll() .then((rooms) => res.status(200).send(rooms)) .catch((er
controllers/rooms.js
从models/rooms.js
导入房间
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
文件)
我有一个路由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()…
因此,我可以将导入重命名为:
从“../models”导入模型
这样说吧:
返回模型.Room.findAll()…
但是,为什么我不能将其称为
return Room.findAll()…
,导入应该如何制定???上次我使用Sequelize时,它与ES6功能不兼容。我的猜测是,models/room.js
由于导出默认值而无法正确导出模型。您可以尝试将该行更改为旧式模块
export default (sequelize, DataTypes) => {
.....
To
.....
module.exports = (sequelize, DataTypes) => {
看看这是否解决了进口问题
在控制器中导入时,可以执行此操作
const Room = require('../models').Room;
这是执行导入的旧方法,现在您的代码应该可以工作了。:)
如果你想尝试ES6,你可以这样做
import {Room} from '../models'
我不确定这个ES6导入在这里是否有效 上次我使用Sequelize时,它与ES6功能的配合不太好。我的猜测是,models/room.js
由于导出默认值而无法正确导出模型。您可以尝试将该行更改为旧式模块
export default (sequelize, DataTypes) => {
.....
To
.....
module.exports = (sequelize, DataTypes) => {
看看这是否解决了进口问题
在控制器中导入时,可以执行此操作
const Room = require('../models').Room;
这是执行导入的旧方法,现在您的代码应该可以工作了。:)
如果你想尝试ES6,你可以这样做
import {Room} from '../models'
我不确定这个ES6导入在这里是否有效 假设您有使用ES6导入的babel设置,您可以尝试这种方法在ES6中导出Sequelize模型
//数据库配置文件
从“Sequelize”导入Sequelize;
export const sequelize=新的sequelize(
config.database.name,
config.database.user,
config.database.password,
{
主机:config.database.host,
方言:config.database.dialent,
池:config.database.pool,
运算符别名:false
}
);代码>假设您有使用ES6导入的babel设置,您可以尝试这种方法在ES6中导出Sequelize模型
//数据库配置文件
从“Sequelize”导入Sequelize;
export const sequelize=新的sequelize(
config.database.name,
config.database.user,
config.database.password,
{
主机:config.database.host,
方言:config.database.dialent,
池:config.database.pool,
运算符别名:false
}
);代码>我试图设置现有代码,但遇到了上述问题。通过将我的节点版本从最新版本降级到10.18.0,问题得以解决
似乎代码最初是使用node version 10开发的。我试图设置现有代码,但遇到了上述问题。通过将我的节点版本从最新版本降级到10.18.0,问题得以解决
似乎代码最初是使用node version 10开发的。请共享数据库连接文件。您可能对该文件有问题。因为您使用的是.defualt键,所以可以直接尝试model.findAll()方法。我认为这没有问题,但是您想要模型文件夹中的config.json
还是index.js
?尝试module.exports=db。在控制器上尝试从“../models”
或import{Room}导入在“../models”
@VassilisPallas中,我之前尝试过,但我用可用代码编辑了我的问题,但我不满意。请共享您的数据库连接文件。您可能对该文件有问题。因为您使用的是.defualt键,所以可以直接尝试model.findAll()方法。我认为这没有问题,但是您想要模型文件夹中的config.json
还是index.js
?尝试module.exports=db。在控制器上尝试从“../models”
或import{Room}导入从“../models”
@VassilisPallas,这不起作用,我之前尝试过,但我用有效的代码编辑了我的问题,但我不满意它的相同错误:/你对不同的ORM有更好的建议吗?你能上传index.js文件吗?你尝试过没有“使用限制”吗?把它拿开试试。请记住重新启动服务器。在没有'user-strict'
的情况下尝试没有帮助,附加的index.js
文件从错误中我只能看到,当您导入模型时,它会以某种方式导入default
关键字,然后尝试调用不存在的.findAll。我认为它应该与模型中更新的导出一起工作。同样的错误:/您对不同的ORM有更好的建议吗?您可以上传index.js文件吗?您尝试过没有“使用限制”吗?把它拿开试试。请记住重新启动服务器。在没有'user-strict'
的情况下尝试没有帮助,附加的index.js
文件从错误中我只能看到,当您导入模型时,它会以某种方式导入default
关键字,然后尝试调用不存在的.findAll。我认为它应该与模型中的更新导出一起工作。