Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用es6风格的导入导入MongoDB?_Javascript_Node.js_Mongodb_Ecmascript 6_Systemjs - Fatal编程技术网

Javascript 如何使用es6风格的导入导入MongoDB?

Javascript 如何使用es6风格的导入导入MongoDB?,javascript,node.js,mongodb,ecmascript-6,systemjs,Javascript,Node.js,Mongodb,Ecmascript 6,Systemjs,希望这是一个简单的问题。我正在尝试使用es6导入自样式导入MongoDB。如果我使用node require导入,它可以正常工作 let mongo = require('mongodb'); let MongoClient = mongo.MongoClient; 但是如果我以es6的方式导入它,它会在没有错误或日志的情况下中断 import {MongoClient} from 'mongodb'; 但编译/运行时它不会中断,只有在我尝试使用MongoClient执行任何操作时它才会中断

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

let mongo = require('mongodb');
let MongoClient = mongo.MongoClient;
但是如果我以es6的方式导入它,它会在没有错误或日志的情况下中断

import {MongoClient} from 'mongodb';
但编译/运行时它不会中断,只有在我尝试使用MongoClient执行任何操作时它才会中断

这是我的数据库管理器类-

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$
System.register("db/db.manager", ["mongodb"] ...
import {Db as MongoDb, MongoClient} from 'mongodb';
let mongodb = require('mongodb');
let mongoClient: MongoClient = mongodb.MongoClient;
没有编译错误,所以我不明白为什么这不起作用。此外,我不明白为什么没有任何日志!这是最后发生的事情之一,至少应该有日志,直到我认为这一点。如果您想在这里看到我的
start.sh
脚本,它就是(又快又脏,不要评判我):

编辑

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

mycomputer myuser$ ./start.sh
mycomputer myuser$
System.register("db/db.manager", ["mongodb"] ...
import {Db as MongoDb, MongoClient} from 'mongodb';
let mongodb = require('mongodb');
let mongoClient: MongoClient = mongodb.MongoClient;
如果我不使用它(即使我导入它),它也不会显示
mongodb

System.register("db/db.manager", [] ...
这就解释了为什么什么都不会发生。尝试导入
mongodb
时出错。还不知道该怎么办

编辑编辑

找到了解决办法。一个我不太喜欢的,但也许它就是这样

我认为我不能依赖es6进口。看起来我可以用它来导入typedefs,但不能导入实际的模块。我是怎么摆脱这一切的-

mycomputer myuser$ ./start.sh
mycomputer myuser$
System.register("db/db.manager", ["mongodb"] ...
import {Db as MongoDb, MongoClient} from 'mongodb';
let mongodb = require('mongodb');
let mongoClient: MongoClient = mongodb.MongoClient;
很多额外的工作。如果有别的办法,请告诉我

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');
试试这个:

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

我使用
import'mongodb'
时运气不佳,因此我通过导入
createRequire
使用了
require

从“模块”导入{createRequire}
const require=createRequire(import.meta.url);
const{MongoClient}=require('mongodb');
我在一个
.mjs
文件中使用了它,其中甚至没有定义require,它就像一个符咒一样工作。

这对我很有用:

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

正如mkalmo所建议的,您可以导入mongodb类型:

步骤1:通过
npm安装--save@types/mongodb

第二步:使用它

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

听着,我知道在这个解决方案中有很多裂缝。有些可能对你有用,但对我来说,除了下面的那个,没有人能解决我

2021年更新:

无聊的后台警报

我们使用的是节点v14.16.0,我们的
包.json
具有
“类型”:“模块”
集。因此,我们的代码是ES6+,commonjs导入在大多数情况下都是一个交易破坏者,特别是当涉及到

幸运的是,它是用打字机写的,工作正常。准备好你破碎的精灵,准备升空哦,与其在源代码中存储您的秘密酱(用户:pass和uri),不如检查
节点配置
,确保安全

解决方案

# 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)

现在你所有的猫今晚都安静地睡着了。希望这能降低世界上未受挑战的疯狂程度,或帮助你完成任务,无论哪一个符合你的成就品味。:)

是的,看起来您可以导入typedefs,但不能导入实际的模块。这实际上就是目的,因为它与
require
系统的功能不同;const MongoClient=mongodb.default.MongoClient;`作品这是一篇关于在节点包中实现es6模块的文章,我目前正在从
mongodb
导入特定包,即
const MongoClient=require('mongodb')。MongoClient
const ObjectID=require('mongodb')).ObjectID
您建议的方法是否会增加代码库大小,因为它是从
mongodb
导入所有包,而不是其中的一部分?const MongoClient=require('mongodb')。MongoClient并不意味着您只导入特定包。您正在阅读整个库,并将其中的一部分存储在名为MongoClient的常量中。它工作得非常好(谢谢!),但我无法理解node如何将“mongodb”解释为一行上的node_modules/@types/mongodb/index.d.ts,另一行上的node_modules/mongodb/index.js。有人能解释一下吗?你太棒了。这是最容易混淆的答案。你也不是无精打采的,@djangofan谢谢你投的信任票。请解释一下否决票,因为它解决了op的问题。