如何使用es6样式导入导入MongoDB?

mic*_*cah 14 javascript mongodb node.js ecmascript-6 systemjs

希望这是一个简单的问题.我正在尝试使用es6 import-from样式导入MongoDB.如果我导入使用节点要求它工作正常.

let mongo = require('mongodb');
let MongoClient = mongo.MongoClient;
Run Code Online (Sandbox Code Playgroud)

但是,如果我以es6方式导入它,它会在没有错误或日志的情况下中断.

import {MongoClient} from 'mongodb';
Run Code Online (Sandbox Code Playgroud)

但是在编译/运行时它不会中断它只会在我尝试使用MongoClient执行任何操作时中断.

这是我的Db Manager课程 -

import {MongoClient} from 'mongodb';

export class DbManager {

  constructor() {
    console.log('Constructing DB Connection');
  }

}
Run Code Online (Sandbox Code Playgroud)

当我运行我的服务器时,我从其他管理器和事件中获取了几个日志.

mycomputer myuser$ ./start.sh
Server Constructing
Route Manager Constructing
Initializing Route: Static
Constructing DB Connection
http server started on port: 8000
Run Code Online (Sandbox Code Playgroud)

但是,如果我执行MongoClient的console.log,则根本没有输出.

import {MongoClient} from 'mongodb';

export class DbManager {

  constructor() {
    console.log('Constructing DB Connection');
    console.log(MongoClient);
  }

}
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样 -

mycomputer myuser$ ./start.sh
mycomputer myuser$
Run Code Online (Sandbox Code Playgroud)

没有编译错误,所以我不明白为什么这不起作用.此外,我不明白为什么没有任何日志!这是最后发生的事情之一,至少应该记录,直到我想到这一点.如果你想start.sh在这里看到我的剧本(快速又脏,不要评判我):

tsc
echo "var System = require('systemjs');" > dist/final.js
babel dist/typescript.js >> dist/final.js
echo "System.import('main');" >> dist/final.js
node dist/final.js
Run Code Online (Sandbox Code Playgroud)

编辑

在等待(希望)响应时继续搜索答案.我正在查看结果final.js,如果在文件中的任何地方使用MongoClient,System.register函数调用看起来像这样 -

System.register("db/db.manager", ["mongodb"] ...
Run Code Online (Sandbox Code Playgroud)

如果我不使用它(即使我导入它)它没有显示mongodb.

System.register("db/db.manager", [] ...
Run Code Online (Sandbox Code Playgroud)

这可以解释为什么什么都不会发生.尝试导入时出了点问题mongodb.还不确定该怎么做.

编辑编辑

找到了解决方案.一个我不是很激动,但也许它只是它必须的方式.

我不认为我可以依赖es6进口.看起来我可以使用它来导入typedef而不是实际的模块.我如何解决这个问题就像这样 -

import {Db as MongoDb, MongoClient} from 'mongodb';
let mongodb = require('mongodb');
let mongoClient: MongoClient = mongodb.MongoClient;
Run Code Online (Sandbox Code Playgroud)

很多额外的工作.如果还有其他方式,请告诉我.

小智 8

import { MongoClient } from 'mongodb';
Run Code Online (Sandbox Code Playgroud)

只需从 node_modules/@types/mongodb/index.d.ts 导入类型定义

import * as mongodb from 'mongodb';
Run Code Online (Sandbox Code Playgroud)

从 node_modules/mongodb/index.js 导入所有内容,其与

let mongodb = require('mongodb');
Run Code Online (Sandbox Code Playgroud)


Lon*_*est 6

尝试这个:

import { default as mongodb } from 'mongodb';
let MongoClient = mongodb.MongoClient;
Run Code Online (Sandbox Code Playgroud)


aza*_*tar 6

听着,我知道这里的这个解决方案有很多漏洞。有些可能对你有用,但对我来说,除了下面的一个之外,没有人解决我。

2021 年更新:

无聊的背景故事提醒

我们正在使用 Node v14.16.0 并且我们package.json已经"type": "module"设置好了。因此,我们的代码是 ES6+ 并且在大多数情况下 commonjs 导入是一个交易破坏者,尤其是当涉及到MongoDB Native 3.6 NodeJS Driver 时

幸运的是,MongoDB Native ^4.0.0-beta.3是用 TypeScript 编写的,并且按预期工作。准备好你破碎的精灵以进行升空。;) 哦,与其在源代码中存储你的秘密武器(user:pass 和 uri),不如检查一下node-config并确保安全。

解决方案

# This version will keep changing after this posts, so take heed.
$ cd path/to/your/project
$ npm i -s mongodb@4.0.0-beta.3
Run Code Online (Sandbox Code Playgroud)

在您的项目中:

import config from 'config'
// MongoDB
import { MongoClient } from 'mongodb'
const client = new MongoClient(config.get('mongodb.uri'))
await client.connect()
const db = client.db()
const stuff = db.collection('AllTheStuff')
const record = {
  type: "ThisAndThat",
  lastUpdated: new Date().getTime()
}
const query = { type: "ThisAndThat" }
const options = { upsert: true }
const result = await stuff.replaceOne(query, record, options)
Run Code Online (Sandbox Code Playgroud)

现在你所有的猫今晚都睡着了。希望这会降低世界上不受挑战的疯狂程度,或帮助您完成任务,无论哪种方式都适合您的成就。:)

  • 你太棒了。这是最不令人困惑的答案。 (3认同)