我想在我的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')
一切正常!!
有任何想法可以解决这个问题吗?
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
答案 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。