2016-05-08 8 views
0

デモアプリケーション私は建物がいくつかMLAB上で実行されているMongoDBのインスタンスによって骨抜きにしてたSuperAgentによって取得されていますコードを反応させるのに役立つためにエクスプレスを使用していますよモンゴDBを照会します私の主要なリアクションコード(index.htmlを介してロードされている)を呼び出します。電子:それは準備ができて前にExpress.jsサーバは

電子メールでデスクトップバージョンを作成しようとしていて、デフォルトの( '/')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内の何かが変更する必要があります。コンソールに記録し、私はリフレッシュした場合、私はDBからデータを取得することができます

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のに接続されている」取得:ここでは短いバージョンがあります問題ない。

ありがとうございます!

答えて

0

おそらくネイティブの回答がありますが、私は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(); 
} 
}); 
+0

お返事ありがとうございました!私は私のために、速い修正は、アプリケーションを正しく構造化し、電子に移動したときになぜそれが変わったのかを理解するほど面白くないと思う。私が迷惑をかけているのは、なぜ私が以前に待つ必要がなかったのかですが、今私はそうしています。 – alphanumeric0101

0

ので、単純に十分な、私がしなければならなかったすべてのデータベースの必要声明をつり上げるました。

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がロードされた後にのみ、サーバーのリッスンを開始することだと思うが、これは今のところうまくいく。

関連する問題