【问题标题】:Electron: Express.js server queries Mongo DB before it's readyElectron:Express.js 服务器在准备好之前查询 Mongo DB
【发布时间】:2016-09-03 06:27:52
【问题描述】:

我正在构建的演示应用程序使用 Express 来提供一些 React 代码,这些代码由运行在 mLab 上的 MongoDB 实例补充 并由我的主要 React 代码中的 SuperAgent 调用检索(通过 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;

我得到的错误说 allTask​​s 是未定义的,然后在那个错误之后我得到“连接到 mongoDB”记录到控制台,然后如果我刷新我可以从数据库中获取数据没问题。

感谢收看!

【问题讨论】:

    标签: javascript node.js mongodb express electron


    【解决方案1】:

    可能有一个本地答案,但我确实找到了一个名为 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();
     }
    });
    

    【讨论】:

    • 您好,感谢您的快速回复!我认为对我来说,快速修复不如正确构建应用程序并理解为什么当我转向电子时它会改变那么有趣。困扰我的是为什么我以前不需要等待,但现在我需要。
    【解决方案2】:

    很简单,我所要做的就是增加数据库的 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();
    

    我的控制台报告它正在侦听,然后它告诉我它已连接到数据库,但无论如何数据都是在第一页加载时加载的。 有点奇怪。我认为更好的解决方案是仅在加载数据库后才启动服务器侦听,但这目前确实有效。

    【讨论】:

      猜你喜欢
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      • 2020-01-20
      • 2019-12-13
      相关资源
      最近更新 更多