Javascript 如何使用es6风格的导入导入MongoDB?
希望这是一个简单的问题。我正在尝试使用es6导入自样式导入MongoDB。如果我使用node require导入,它可以正常工作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执行任何操作时它才会中断
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的问题。