【问题标题】:TypeError: require(...) is not a function while Using sequalize with node jsTypeError: require(...) is not a function while Using sequelize with node js
【发布时间】:2022-04-28 16:21:32
【问题描述】:

我是 Web 开发的初学者,正在尝试使用 Mysql Express React Node js 创建一个全栈项目。 在将 Sequalize 与 node js 一起使用时遇到此 TypeError 问题。 我是新手,我无法理解这个问题。有人可以向我解释一下并帮助我找到解决方案吗? (PS:如果你们需要任何其他文件,请告诉我)

服务器 js

const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");

const app = express();

var corsOptions = {
  origin: "http://localhost:8081"
};

app.use(cors(corsOptions));

// parse requests of content-type - application/json
app.use(bodyParser.json());

// parse requests of content-type - application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));

const db = require("./models");

db.sequelize.sync({ force: true }).then(() => {
  console.log("Drop and re-sync db.");
});

// simple route
app.get("/", (req, res) => {
  res.json({ message: "Welcome." });
});


require("./src/routes/routes")(app);
// set port, listen for requests
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}.`);
});

索引 js

const dbConfig = require("../config/db.config.js");

const Sequelize = require("sequelize");
const sequelize = new Sequelize(dbConfig.DB, dbConfig.USER, dbConfig.PASSWORD, {
  host: dbConfig.HOST,
  dialect: dbConfig.dialect,
  operatorsAliases: false,

  pool: {
    max: dbConfig.pool.max,
    min: dbConfig.pool.min,
    acquire: dbConfig.pool.acquire,
    idle: dbConfig.pool.idle
  }
});

const db = {};

db.Sequelize = Sequelize;
db.sequelize = sequelize;

db.devices = require("./devices.js")(sequelize, Sequelize);

module.exports = db;

设备 js


module.exports = (sequelize, Sequelize) => {
    const Device = sequelize.define("devices", {
      serialno: {
        type: Sequelize.INTEGER
      },
      brand: {
        type: Sequelize.STRING
      },
    modelname: {
        type: Sequelize.STRING
      }
    });
  
    return Device;
  };

错误

db.devices = require("./devices.js")(sequelize, Sequelize);
                                    ^
TypeError: require(...) is not a function
    at Object.<anonymous> (C:\Users\theta\Documents\project\src\models\index.js:22:37)
    at Module._compile (internal/modules/cjs/loader.js:1138:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
    at Module.load (internal/modules/cjs/loader.js:986:32)
    at Function.Module._load (internal/modules/cjs/loader.js:879:14)
    at Module.require (internal/modules/cjs/loader.js:1026:19)
    at require (internal/modules/cjs/helpers.js:72:18)
    at Object.<anonymous> (C:\Users\theta\Documents\project\src\server.js:19:12)
    at Module._compile (internal/modules/cjs/loader.js:1138:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)

【问题讨论】:

  • 该错误表明您没有将函数作为devices.js 的导出返回,而是按原样使用它。请同时显示devices.js。您可以点击edit 为您的问题添加详细信息。
  • @cbr 我添加了 device.js 文件
  • 是否有多个名为devices.js的文件? index.js文件和devices.js文件在同一个目录吗?
  • @cbr 不,只有一个 devices.js 文件,是的,它们都在同一个文件夹中
  • 老实说,我当时看不到问题所在。你确定你在修改后保存了文件吗?并重启node?

标签: mysql node.js reactjs express sequelize.js


【解决方案1】:

尝试在 index.js 上更改此设置:

db.devices = require("./devices.js")(sequelize, Sequelize);

到这里:

const path = require('path')

db.devices = require(path.join(__dirname, 'devices'))(sequelize, Sequelize);

这就是我在 TypeScript 中的工作方式(使用 sequelize 版本 6.17.0):

config.ts

import { Sequelize } from 'sequelize'

const dbName = 'test-db'
const dbUser = 'test-user'
const dbPass = '123123'
const dbHost = 'some-host'

// new Sequelize(name, user, password, options)
export const sequelize = new Sequelize(dbName, dbUser, dbPass, {
  host: dbHost,
  dialect: 'postgres',
  port: 3306,
  dialectOptions: {
    multipleStatements: true,
  },
  pool: {
    max: 5,
    min: 0,
    idle: 10000,
  },
  logging: false,
})

假设我们有一个 models/ 文件夹,其中包含三个文件:User.tsMember.tsindex.ts

models/User.ts → 我们必须在这里使用module.exports

module.exports = (sequelize: any, DataTypes: any) => {
  const User = sequelize.define(
    'user',
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        allowNull: false,
        primaryKey: true,
      },
      email: {
        type: DataTypes.STRING(250),
        allowNull: false,
        unique: true,
      },
      password: {
        type: DataTypes.STRING,
        allowNull: true,
        defaultValue: null,
      },
    },
    {
      timestamps: true,
      underscored: true,
      tableName: 'user',
      indexes: [{ unique: true, fields: ['email'] }],
    }
  )

  User.associate = (models: any) => {
    User.hasOne(models.Member, { as: 'Member', foreignKey: 'id' })
  }

  return User
}

models/index.ts

import fs from 'fs'
import path from 'path'
import Sequelize from 'sequelize'
import { sequelize } from './config.js'

// current file basename
const basename = path.basename(__filename)

// our db object
const db: any = {}

// so we don't reload unecessarily
let loaded = false 

const createModels = () => {
  // if already loaded, return cached object
  if (loaded) return db 

  // create an array of model files' basenames
  const filenames = fs.readdirSync(__dirname).filter((file: string) => {
    return (
      // filter out the current `index.ts` file
      file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.ts'
    )
  })

  filenames.map((file: any) => {
    // use `require` to load our models
    const model = require(path.join(__dirname, file))(
      sequelize,
      Sequelize.DataTypes
    )
    db[model.name] = model
  })

  // run `.associate` if applicable
  Object.keys(db).map((model) => {
    if (db[model].associate) {
      db[model].associate(db)
    }
  })
  
  // attach both our instance and Sequelize to our db object
  db.sequelize = sequelize
  db.Sequelize = Sequelize

  loaded = true

  return db
}

export default createModels()

export { createModels }

告诉我进展如何。

【讨论】:

    【解决方案2】:

    如果您要导入任何文件,例如字体文件,则创建一个只有该文件的 mockFile

    // mockFile.ts or mockFile.js
    export default {};
    

    然后在 jest.config.js 中

      moduleNameMapper: {
        '^.+\\.(woff2)$': '<rootDir>/<path to file>/mockFile.ts',
      },
    

    这将在尝试导入字体文件时解析为 mockFil。您还可以添加其他文件扩展名,例如'^.+\\.(jpg|png|woff2)$: '&lt;rootDir&gt;/&lt;path to file&gt;/mockFile.ts'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-26
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 2017-11-19
      • 2018-10-25
      • 2016-01-05
      相关资源
      最近更新 更多