【问题标题】:How to use require and esm in 1 project?如何在 1 个项目中使用 require 和 esm?
【发布时间】:2022-12-11 02:05:03
【问题描述】:

我使用 node 版本 16.14.2,并尝试在我的项目中使用 ES Module。在我的下面包.json.

{
  "name": "community",
  "version": "0.0.1",
  "description": "community",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "start": "nodemon server.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "dotenv": "^16.0.0",
    "express": "^4.17.3",
    "express-async-handler": "^1.2.0",
    "jsonwebtoken": "^8.5.1",
    "mysql": "^2.18.1",
    "mysql2": "^2.3.3",
    "nodemon": "^2.0.15",
    "sequelize": "^6.19.0"
  },
  "devDependencies": {
    "sequelize-cli": "^6.4.1"
  }
}

我将 Sequelize 用于 ORM,并使用 sequelize-cli 生成模型。 我的模型模型/userModel.js

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class User extends Model {
    static associate(models) {
    }
  }
  User.init({
    email: DataTypes.STRING,
    password: DataTypes.STRING,
  }, {
    sequelize,
    modelName: 'User',
  });
  return User;
};

这是我的控制器/userController.js

import User from '../models/userModel.js'
import asyncHandler from 'express-async-handler'
import generateToken from '../utils/generateToken.js'

const registerUser = asyncHandler(async(req, res) => {
  const { first_name, last_name, email, password } = req.body
  const userExists = await User.findOne({
    where: { email: email },
    order: [ [ 'createdAt', 'DESC' ]],
  });
  res.send('ok', userExists);
})

我试过这个:

a). 我在我的控制器上使用 import

import User from '../models/userModel.js'

但后来我得到一个错误

SyntaxError: 请求的模块 '../models/userModel.js' 没有 提供名为“默认”的导出

b).所以我把我的模型改成这样(使用导入和导出默认值)

'use strict';
import { Model } from 'sequelize'
const userModel = (sequelize, DataTypes) => {
  class User extends Model {
    static associate(models) {
    }
  }
  User.init({
    email: DataTypes.STRING,
    password: DataTypes.STRING,
  }, {
    sequelize,
    modelName: 'User',
  });
  return User;
};
export default userModel;

我在服务器上没有收到任何错误,但是当我尝试获取数据(注册用户)时,我的邮递员出错了。

"message": "User.findOne 不是函数",
"stack": "TypeError: User.findOne 不是函数\n ....

谢谢你。

【问题讨论】:

标签: node.js express sequelize.js es6-modules


【解决方案1】:

如何在 1 个项目中使用 require 和 esm?

不。它造成了混乱。不在遗留项目中工作时使用现代模块语法。

我将 Sequelize 用于 ORM,并使用 sequelize-cli 生成模型。

sequelize-auto命令支持a -l esm parameter生成ES6 ESM模块。

【讨论】:

    【解决方案2】:
    import Module from "node:module";
    
    const require = Module.createRequire(import.meta.url);
    

    这是您要找的require。使用它来导入 ESM import 不支持的内容,例如 Node.js 附加组件 (.node)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-01
      • 2018-01-26
      • 2021-12-05
      • 2016-10-27
      • 1970-01-01
      • 2016-03-01
      • 2016-09-24
      • 1970-01-01
      相关资源
      最近更新 更多