如何将Mongoose / MongoDB包含在Express.JS应用程序中(ES2015方式)

我试图在我的Express.JS应用程序(ES2015方式)中包含mongoose/ mongodb。

首先,我有主文件:

import path from 'path' import express from 'express' import mongoose from 'mongoose' mongoose.connect('mongodb://localhost/timelines') const app = express() app.use(express.static('dist/client/')) app.get('*', (req, res) => { res.sendFile(path.resolve('dist/client/index.html')) }) app.listen(3000) 

然后错误信息:

 [nodemon] starting `node dist/server/app.js` undefined:8 driver = !(function webpackMissingModule() { var e = new Error("Cannot find module \".\""); e.code = 'MODULE_NOT_FOUND';; throw e; }()); ^ Error: Cannot find module "." 

我的webpackconfiguration:

 export default [ { entry: './src/server/app.js', target: 'node', output: { path: './dist/server', filename: 'app.js' }, module: { loaders: [ { test: /\.js$/, exclude: /(node_modules|bower_components)/, loader: 'babel-loader', query: { presets: ['es2015'] } } ] } }, { entry: './src/client/app.js', output: { path: './dist/client', filename: 'app.js' }, module: { loaders: [ { test: /\.js$/, exclude: /(node_modules|bower_components)/, loader: 'babel-loader', query: { presets: ['es2015', 'stage-2', 'react'] } } ] } } ] 

现在,有趣的部分:

在我添加之前

 import mongoose from 'mongoose' mongoose.connect('mongodb://localhost/timelines') 

一切工作正常!

任何想法如何解决这个问题?

编辑1:

webpack抛出一个警告:

 WARNING in ./~/es6-promise/dist/es6-promise.js Module not found: Error: Can't resolve 'vertx' in '/Users/timo/Desktop/Timelines/node_modules/es6-promise/dist' @ ./~/es6-promise/dist/es6-promise.js 131:20-30 @ ./~/mongodb/lib/mongo_client.js @ ./~/mongodb/index.js @ ./~/mongoose/lib/index.js @ ./~/mongoose/index.js @ ./src/server/app.js 

我遇到了同样的问题,为了解决这个问题,有几个关键的步骤。

首先,请检查您是否安装了Mongoose所期望的MongoDB服务器版本: Mongoose MongoDB NodeJS驱动程序兼容性

这个问题的根本原因是Webpack试图解决一个dynamic的需求来加载MongoDB NodeJS驱动程序:

 if (typeof window === 'undefined') { driver = require(global.MONGOOSE_DRIVER_PATH || './node-mongodb-native'); } else { driver = require('./browser'); } 

我们需要指示webpack忽略所有外部导入,因为我们不需要捆绑它们,因为它们永远不会被发送到客户端。

我们可以通过添加下面的webpackconfiguration来实现:

 module.exports = { // tell webpack that it is building for the NodeJS environment ... target: 'node', output: { ... // we want the output to use simple require calls for imports as // nodejs would expect libraryTarget: 'commonjs' }, ... externals: [ // consider everything imported from a non-relative path an external // this will flag everything such as: // import express from 'express' // or // import mongoose from 'mongoose' /^(?!\.|\/).+/i ] } 

当您再次运行构build并启动结果包时,不应再收到来自Webpack的隐含错误消息,并且发现您的服务器现在正在按预期运行。

我想你错过了一个分号。 开玩笑。 (但是,严重的是,如果你不使用分号,那么如果你不能100%确定你正在做什么,那么你会遇到问题。至less根据eslint-config-npm提示你的代码,以确保你不是在实际上很重要的地方丢失了一个分号。)

确保你已经正确安装了mongoose模块,并且包含了webpack所需要的所有东西。 它看起来像一些代码试图导入'。' 不能这样做 – 例如,没有package.json或不完整的package.json。