如何将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。
- 在Jade中快速显示mongodb文档
- 如何从Node js Side获取基本path?
- Node.js在HTTP 80端口上侦听EACCES错误(权限被拒绝)
- PassportJs的passport.session()与file upload冲突 – 不会写入文件
- 单页面应用程序,http或websockets,连接/expression完成?
- 如何在node.js中使用express框架来提供图像文件?
- 在Nodejs应用程序中,如何在Express方法中创buildHTTP客户端请求
- Eclipse中的Node Express Project的JavaScript文件中没有定义'angular'
- Heroku Node.js应用程序在本地工作,但部署时不工作