簡體   English   中英

NodeJS 無法導入 Sequelize.js 模型 (ES6)

[英]NodeJS unable to import Sequelize.js model (ES6)

我正在使用 Express 和 Sequeulize 運行 NodeJS,並且我有一個文件controllers/rooms.jsmodels/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 defaultmodels/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM