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

时间:2016-03-12 20:26:04

标签: javascript node.js mongodb ecmascript-6 systemjs

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

let mongo = require('mongodb');
let MongoClient = mongo.MongoClient;

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

import {MongoClient} from 'mongodb';

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

这是我的Db Manager类 -

import {MongoClient} from 'mongodb';

export class DbManager {

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

}

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

mycomputer myuser$ ./start.sh
Server Constructing
Route Manager Constructing
Initializing Route: Static
Constructing DB Connection
http server started on port: 8000

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

import {MongoClient} from 'mongodb';

export class DbManager {

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

}

输出看起来像这样 -

mycomputer myuser$ ./start.sh
mycomputer myuser$

没有编译错误,所以我不明白为什么这不起作用。此外,我不明白为什么没有任何日志!这是最后发生的事情之一,至少应该记录,直到我想到这一点。如果你想在这里看到我的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

修改

在等待(希望)回复的同时继续搜索答案。我正在查看生成的final.js,如果在文件中的任何位置使用MongoClient,则System.register函数调用如下所示 -

System.register("db/db.manager", ["mongodb"] ...

如果我不使用它(即使我导入它),它也不显示mongodb

System.register("db/db.manager", [] ...

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

编辑编辑

找到解决方案。一个我并不感到兴奋,但也许它就是它必须的方式。

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

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

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

6 个答案:

答案 0 :(得分:3)

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

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

在您的项目中:

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)

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

答案 1 :(得分:2)

import { MongoClient } from 'mongodb';

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

import * as mongodb from 'mongodb';

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

相同
let mongodb = require('mongodb');

答案 2 :(得分:0)

尝试一下:

import { default as mongodb } from 'mongodb';
let MongoClient = mongodb.MongoClient;

答案 3 :(得分:0)

使用import 'mongodb'并没有运气,所以我通过导入require使用了createRequire

import { createRequire } from 'module'
const require = createRequire(import.meta.url);
const { MongoClient } = require('mongodb');

我在.mjs文件中使用了此文件,其中甚至没有定义require,并且它就像一个魅力。

答案 4 :(得分:-1)

这对我有用:

import mongodb from 'mongodb'
const { MongoClient } = mongodb

答案 5 :(得分:-1)

按照mkalmo的建议,您可以导入mongodb类型:

第1步:通过npm mongodb types package安装
npm install --save @types/mongodb

第2步:使用它!

import mongodb from "mongodb";
const MongoClient = mongodb.MongoClient;