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

标签 javascript node.js mongodb ecmascript-6 systemjs

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

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

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

import {MongoClient} from 'mongodb';

但它不会在编译/运行时中断,它只会在我尝试使用 MongoClient 做任何事情时中断。

这是我的 Db Manager 类(class)-

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;

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

最佳答案

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

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)

现在你所有的猫今晚都安静地睡着了。希望这可以降低世界上无可争议的精神错乱程度,或者帮助您完成任务,以符合您对成就的品味。 :)

关于javascript - 如何使用 es6 样式导入导入 MongoDB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35962879/

相关文章:

javascript - 如何优化 async.js API 调用?

Node.js JavaScript 字符串化

node.js - 快速路由 "/"

mongodb - 如何在 pymongo 中返回 mongodb 对象数组(没有游标)? MapReduce 可以做到这一点吗?

java - 无法将多个值插入mongodb

javascript - 在javascript中将时间戳转换为人类日期的函数

javascript - 正则表达式检查字符串中是否有任何单词不超过限制

node.js - 将 Node/Mongo 部署到 Openshift

JavaScript foreach 循环遍历十六进制值数组,使用 setTimeout 循环遍历背景颜色

javascript - 当 Infinity 位于响应中时,jQuery $.get 响应不同