如何在Express.JS-App中包含Mongoose / MongoDB(ES2015方式)

时间:2017-03-08 14:42:44

标签: node.js mongodb express

我想在我的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 "."

我的webpack配置:

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

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,并且有几个关键步骤来解决它。

首先,请检查您是否安装了Mongoose期望的MongoDB服务器版本: Mongoose MongoDB NodeJS driver compatibility

问题的根本原因是Webpack正在尝试解决动态需求以加载MongoDB NodeJS驱动程序:

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

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

我们可以通过添加以下webpack配置来实现:

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

    ]
}

当您再次运行构建并启动生成的捆绑包时,您不应再从Webpack收到神秘的错误消息,并发现您的服务器现在正在按预期运行。

答案 1 :(得分:0)

我认为你错过了一个分号。开玩笑。 (但严重的是,如果你没有使用分号,那么如果你不能100%确定自己在做什么,那么你会遇到问题。至少根据eslint-config-npm来修改你的代码,以确保你不是错过了一个实际上很重要的分号。)

确保您正确安装了mongoose模块及其依赖项,并且包含了webpack中所需的所有内容。看起来有些代码试图导入'。'并且不能这样做 - 例如,那里没有package.json或不完整的package.json。