【问题标题】:Mongoose is undefined when using import syntax and not when using requireMongoose 在使用 import 语法时未定义,而在使用 require 时未定义
【发布时间】:2019-12-14 17:14:52
【问题描述】:

所以我的模块是这样写的

import mongoose from 'mongoose';

export class MyModule {
   constructor(){
       //do
   }

   create(str){
      mongoose.connect(str); //cannot find property 'connect' of undefined
   }

}

使用导入语法时,我收到cannot find property 'connect' of undefined 错误;使用 require 时,它​​按预期工作。

奇怪的是,通过导入语法导入单个属性按预期工作,

import { connect } from 'mongoose'

但由于某些其他原因,我需要访问整个 ORM。

为什么会这样?难道我做错了什么?公平地说,我在 ES6 模块系统、TypeScript 和 Node.js 方面没有太多经验,所以我可能会在这里遗漏一些东西。


我在 Node.js 上使用 NestJS 在 typescript 文件上运行它。

【问题讨论】:

  • 是否在node_modules 中安装了mongoose? npm安装有什么错误吗?
  • 要清楚,当您将代码示例的第一行替换为 const mongoose = require('mongoose'); 时,它有效吗?您是否使用 Node.js 执行此代码?
  • @nivendha 是的,我已经在我的 package.json 中有它,它也存在于 node_modules 文件夹中
  • @PatrickHund 是的,是的,我正在使用 NestJS 作为框架
  • import * as mongoose from 'mongoose'; 试试这个

标签: javascript typescript mongoose ecmascript-6 nestjs


【解决方案1】:

在你的tsconfig.json文件中,你可以设置

"allowSyntheticDefaultImports": true,
"esModuleInterop": true

这将允许您使用语法

import mongoose from 'mongoose';

【讨论】:

  • 哇,这绝对是个好信息。我希望在这篇文章很热门的时候得到这个答案。
【解决方案2】:

安装@types/mongoose后,VS Code 报告说mongoose没有默认导出(都被命名为exports)就是这样,做

import mongoose from `mongoose`

不会工作。这也解释了为什么获取单个属性会起作用:

import { connect } from `mongoose`

作为一种解决方法,感谢@Binit Ghetiya 在此线程中首次提到它,您应该这样做:

import * as mongoose from `mongoose`

它将 Mongoose 的每个命名导出编译到变量 mongoose

【讨论】:

    【解决方案3】:

    我们可以在这里使用总共 2 个语法。

    ES15 (NodeJS)

    const mongoose = require('mongoose');
    

    然后使用 mongoose.connect

    ES16(导入/导出)

    import * as mongoose from `mongoose`;
    

    然后使用 mongoose.connect

    import {connect} from `mongoose`;
    

    然后直接使用connect

    【讨论】:

    • 不幸的是,这不能作为我问题的可接受答案(那些对未来读者有用的答案)。我亲自写了一个答案,并给出了不错的解释,并提到了您的句柄。
    • @AbanaClara 不用担心 :),希望你能得到答案。
    【解决方案4】:

    只需将导入更改如下:

    import * as mongoose from 'mongoose';
    

    这是一个例子:

    import * as mongoose from 'mongoose';
    
    export class MyModule {
    
       constructor(){
           //do
       }
    
       create(str){
          mongoose.connect(str);
       }
    }
    

    【讨论】:

    • 请注意,这是特定于 Typescript 的语法,并且违反了 ES6 标准。现在它可以工作,但是将来当 Typescript 与 ES6 重新对齐时,这可能会中断(或者可能不会,这取决于微软想用他们发明的语言做什么)。见:stackoverflow.com/questions/29596714/…
    猜你喜欢
    • 2015-04-26
    • 2017-09-25
    • 2021-08-01
    • 2019-05-23
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多