我正在Windows平台上开发MEAN堆栈应用程序,并将在完全开发后将其部署到基于Linux的远程服务器上。如果我在连接到MongoDB(使用mongod)之前启动Express应用程序(使用npm start),则Express应用程序首先会引发错误,因为它无法与MongoDB建立连接。一旦MongoDB启动并运行,Express应用程序会通知我MongoDB现在已连接到端口27017。但是,我通过Angular应用程序执行的任何http发布请求都会导致Express返回200状态代码(这告诉我一切正常),但是MongoDB由于http发布请求而无法创建文档。这可以通过确保在启动Express应用之前执行mongod来进行管理。但是当mongodb连接断开(无论出于何种原因)然后重新建立连接时,也会发生此问题。这是我最担心的问题-该快递无法识别mongodb连接已重新建立。在这种情况下,当执行post http请求时,如何确保MongoDB不仅已连接,而且连接可以成功创建新文档?有人建议我从mongoose.connection.on事件侦听器内部初始化express应用。似乎是个好主意,但由于“ app”不再是可识别的变量,我的应用程序崩溃了(请参见下面的代码)。那我该怎么办?
快速app.js文件:
var express = require('express');
var mongoose = require('mongoose');
var mongoose_uri = process.env.MONGOOSE_URI || "mongodb://abc:abc123@localhost:27017/databank?authSource=admin";
mongoose.set('debug', true);
mongoose.connect(mongoose_uri);
mongoose.connection.on('connected', ()=>{
console.log('MongoDB connected at port 27017');
var app = express();
});
mongoose.connection.on('error', (err)=>{
console.log(err);
});
/*By placing var app = express() inside the mongoose.connection.on section, npm start throws an error saying it doesn't recognize "app" as used below.*/
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(cors());
//Call all routers here
app.use('/users', usersRouter);
app.use('/api/contactus', contactUsRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
如果在var app = express();
代码之外声明了mongoose.connection.on
(在连接到mongodb之前或之后),则该应用程序可以正常工作,除了express无法识别在连接到mongodb之后已经重新建立了连接出于不可预见的原因掉线了。在mongoose.connection.on部分之外的var app=express()
下,当我重新启动快速应用程序时,我的问题已解决,但我并不会总是拥有在生产时检查日志并重新启动该应用程序的奢望,我想确保成功执行所有CRUD操作。有什么建议吗?