Node.js NodeJS无法导入Sequelize.js模型(ES6)

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

我正在用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((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。我认为它应该与模型中的更新导出一起工作。