希望这是一个简单的问题。我正在尝试使用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;
很多额外的工作。如果有其他方式,请告诉我。
答案 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;