Electron:Express.js服务器在Mongo数据库'It’准备好了
Electron: Express.js server queries Mongo DB before it's ready
我正在构建的一个演示应用程序使用Express来提供一些React代码,这些代码由运行在mLab上的MongoDB实例浇灌,并由SuperAgent调用在我的主React代码中检索(通过index.html加载)。
启动服务器并在浏览器中查看效果很好,我正试图用Electron创建一个桌面版本,但在默认("/")GET路由上的初始数据库查询遇到了问题。
简而言之,使用Superagent,我的应用程序会在连接数据库之前尝试访问数据库,第一个查询返回为空。如果我刷新页面,所有的东西都在那里,所以它最终是连接的,只是自从转移到电子之后,时间发生了某种变化。
这是我转到电子后的快递服务器:
const electron = require('electron');
const app = require('app');
const BrowserWindow = require('browser-window');
const express = require('express'),
db = require('./model/db'),
bodyParser = require('body-parser'),
http = require('http'),
path = require('path');
const expressApp = express();
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
var mainWindow = null;
// Quit when all windows are closed.
app.on('window-all-closed', function() {
// On OS X it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform != 'darwin') {
app.quit();
}
});
function onListening() {
mainWindow.loadURL('http://127.0.0.1:3000');
//mainWindow.toggleDevTools();
}
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
app.on('ready', function() {
// Create the browser window.
mainWindow = new BrowserWindow({width: 800, height: 600});
expressApp.set('port', process.env.PORT || 3000);
expressApp.use(bodyParser.json());
expressApp.use(bodyParser.urlencoded({ extended: true }));
expressApp.use(express.static(path.join(__dirname, './')));
expressApp.get('/', function(req, res) {
res.render('index');
});
expressApp.get('/tasks/all', db.readAllTasks);
expressApp.post('/tasks/createTask', db.createTask);
expressApp.delete('/tasks/deleteTask/:id', db.deleteTask);
expressApp.put('/tasks/updateTask/:id', db.updateTask);
server = http.createServer(expressApp);
server.listen(expressApp.get('port'), function(){console.log("Listenning!")});
server.on('listening', onListening);
// Emitted when the window is closed.
mainWindow.on('closed', function() {
mainWindow = null;
});
});
在此之前,服务器只是看起来像:
var express = require('express');
var db = require('./model/db');
var bodyParser = require('body-parser');
var http = require('http');
var path = require('path');
var app = express();
app.set('port', process.env.PORT || 3000);
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname, './')));
app.get('/', function(req, res) {
res.render('index');
});
app.get('/tasks/all', db.readAllTasks);
app.post('/tasks/createTask', db.createTask);
app.delete('/tasks/deleteTask/:id', db.deleteTask);
app.put('/tasks/updateTask/:id', db.updateTask);
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
我想,很可能,我所需要做的就是把我的res.render转移到某种回调中?
或者,也许我的db.js中的某些内容需要更改。这是一个简短的版本:
var Task = mongoose.model( 'Task', taskSchema );
mongoose.connect( '<connection string>' );
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function(){
console.log('Connected to mongoDB');
});
var allTasks = db.collection('tasks');
function readAllTasks(req, res) {
var holster = []
allTasks.find({}).forEach(function(doc){
holster.push(doc);
}, function(){
res.send(holster);
});
}
exports.readAllTasks = readAllTasks;
我得到的错误说allTasks是未定义的,然后在这个错误之后,我会将"Connected to mongoDB"记录到控制台,然后如果我刷新,我可以毫无问题地从DB中获取数据。
谢谢你的光临!
可能有一个原生的答案,但我确实找到了一个名为wait for mongo的小js文件,它应该可以让您快速解决问题。根据他们的文档,你可以这样包装你的res.render:
var waitForMongo = require('wait-for-mongo');
waitForMongo('<connection string>', {timeout: 1000 * 60* 2}, function(err) {
if(err) {
console.log('timeout exceeded');
} else {
console.log('mongodb comes online');
res.render();
}
});
简单地说,我所要做的就是为数据库增加require语句。
const electron = require('electron');
const app = require('app');
const BrowserWindow = require('browser-window');
const db = require('./model/db')
const express = require('express'),
bodyParser = require('body-parser'),
http = require('http'),
path = require('path');
const expressApp = express();
我的控制台报告它正在listenning,然后它告诉我它连接到了DB,但数据无论如何都是在第一页加载时加载的。有点奇怪。我认为一个更好的解决方案是只在加载DB后才启动服务器侦听,但这目前确实有效。
- Electron:Express.js服务器在Mongo数据库'It’准备好了
- 我怎么知道Jqgrid已经准备好了
- Javascript+HTML中的日期选择器准备好了吗?(需要:DD、MM、YY的单独字段加上日历选择器)
- 杜兰达尔.js文件准备好了
- Jquery文档准备好了函数声明
- jquery在文档上发布准备好了
- JSON时调用函数.Parse() 已经准备好了
- 在页面底部加载脚本是否保证在执行任何脚本之前DOM都准备好了
- FileReader JS Api在它之前调用Fire'It’准备好了
- 为什么Internet Explorer有时会在数据'It’准备好了
- Knockback.js制作准备好了吗
- getElementById有时为null.已经试过了.加载完毕.准备好了
- javascript作用域和jquery's$(文档).准备好了
- Jquery(美元).val ();准备好了,不工作了
- jQuery data()在窗口.加载和文档.准备好了,没有定义
- Jquery滑块加载图像时,准备好了占位符
- Javascript函数不能在jquery $(document)中工作.准备好了
- 我如何选择元素后添加的类名文档准备好了
- jQuery.准备好了
- jQuery文档中的调用函数准备好了