2017-02-11 16 views
0

私はNodejsを初めて使用しており、手続き型言語のバックグラウンドから来ているので、私のコードの実行フローを知る必要があります。 Nodejsプロシージャの流れに関する一般的な質問があります。これはシナリオです:NodeJSプロシージャの実行フロー

コード構造:

Appnamefolder 
    ...standard node folders(.idea,css,fonts,etc) 
    ...model 
    ....database.js (connect to db and execute db queries) 
    ...public 
    ...routes 
    ....users.js (GET and POST procedures....calls db queries via module.export) 
    ...views 
    ...app.js 
    ...other js files 

質問は、データベースに関するものです。 DB接続はapp.jsファイルにありませんが、modelフォルダ内の.jsファイルにはDB接続がどの時点で作成されていますか? DBクエリが作成されるたびに行われる接続ですか?

私はDB接続が一度だけ行われ、アプリケーションが終了するまで接続したままにしておきたいと考えています。私はapp.jsでDBを接続しようとしましたが、私はDBクエリをしようとするとエラーが発生するので、DBクエリと同じファイルにDBを接続する必要があります......どういうわけかこれは間違っています。誰もこの流れをノードがどのように扱うか説明することはできますか?....どんな援助も感謝しています。

EDIT:ここでは、コード

app.js

var express = require('express'); 
var path=require('path'); 
var bodyParser = require('body-parser'); 
var cookieParser=require('cookie-parser'); 
var expressSession=require('express-session'); 
var expejs = require('ejs'); 
var expressValidator = require('express-validator'); 
var flash = require('connect-flash'); 
var expressSession = require('express-session'); 
var expressLayouts=require("express-ejs-layouts") // add this requirement 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 
var crypto = require("crypto"); 
var loaddealerTable=require('./loaddealerTable'); 


//var neo4j = require('neo4j-driver').v1; 
// var neo4jdb = neo4j.driver("bolt://localhost:7474", neo4j.auth.basic("neo4j", "password"), 
// { 
//   trust: "TRUST_ON_FIRST_USE", 
//  encrypted:true 
// }); 
//***************Notifications Permission******* 


var routes = require('./routes/index'); 
var users = require('./routes/users'); 

var csocket=require('./socketconnections'); 

var app=express(); 
var server=require('http').createServer(app); 
sockets = require('./socketserver'); 
//rpaMessageWaiting = require('./getRPAmessages'); 

//var io=require('socket.io').listen(server); 


// View Engine 
app.set('views', path.join(__dirname,'views')); 
app.set('view options', { layout:'layout.ejs' }); 
app.set('view engine','ejs'); 

//bodyParsers middleware 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(cookieParser()); 

app.use(expressLayouts); 

//set up public folder 
app.use(express.static(path.join(__dirname, '/public'))); 

// set express session with secret 
app.use(expressSession({ secret: process.env.SESSION_SECRET || 'secret', 
         resave: true, 
         saveUninitialized: true 

         })); 
// Passport initialization 
app.use(passport.initialize()); 
app.use(passport.session()); 


//Express Validitor...validate inputs..taken from github middleware options 

app.use(expressValidator({ 
    errorFormatter: function(param, msg, value) { 
     var namespace = param.split('.') 
     , root = namespace.shift() 
     , formParam = root; 

    while(namespace.length) { 
     formParam += '[' + namespace.shift() + ']'; 
    } 
    return { 
     param : formParam, 
     msg : msg, 
     value : value 
    }; 
    } 
})); 


// connect flash middleware 
app.use(flash()); 

// set global variables for flash messages 
app.use(function (req, res, next) 
    { 
    res.locals.success_msg = req.flash('success_msg'); 
    res.locals.error_msg = req.flash('error_msg'); 
    res.locals.error = req.flash('error'); 
    res.locals.user = req.user || null; 
    next(); 
    }); 

// Middelware for route files 

app.use('/', routes); 
app.use('/users', users); //need to check routing 
sockets.startSocketServer(server); 
//load dealer table 
    console.log("load dealer table"); 
**loaddealerTable(); //First call on the DB** 



//============socket io listening======================= 
     app.set('port',(process.env.PORT|| 3000)); 
     server.listen(app.get('port'), function() 
     { 
     console.log('Server started on port '+app.get('port')); 
    // console.log('Server started on port .....'); 
     // app.get('/index',function (req,res) { 
     // // body... 
     // res.render(__dirname+'/index'); 

     }); 

loaddealertable.js

var loaddealerTable=function() 
    { 
    var memorytbl=require('./memorytables'); 
    var User = require('./model/user'); 
    var getHashKey=require('./gethashkey'); 
    const hashMax=1000; 
    console.log("call get dealers from DB"); 
    User.getallDealers(function(err,dealerFound,result) 
    { 
     if (dealerFound) 
     { 
     //  

     for (i=0; i< result.records.length; i++) 
     { 

     memorytbl.Dealer.email  =result.records[i].get(0).properties.email; 
     memorytbl.Dealer.name  =result.records[i].get(0).properties.name; 
     memorytbl.Dealer.telephone =result.records[i].get(0).properties.storenumber; 
     memorytbl.Dealer.creditcard =result.records[i].get(0).properties.creditcard; 
     memorytbl.Dealer.delivery =result.records[i].get(0).properties.delivery; 
     memorytbl.Dealer.location =result.records[i].get(0).properties.location; 
     memorytbl.Dealer.rating  =result.records[i].get(0).properties.rating; 

     var hashIndex = getHashKey(memorytbl.Dealer.email ,hashMax); 
     memorytbl.DealersQ[hashIndex]=memorytbl.Dealer; 



     } //end of for i 

     } //end of if.... 
     else 
     { 
     console.log("No dealers found....table is empty"); 
     } 
    }) //end of loaddealers table db call 


    } //end of load dealers table function 
    module.exports=loaddealerTable; 

user.jsの

var express = require('express'); 
var bcrypt = require('bcryptjs'); 
var router = express.Router(); 
var neo4j = require('neo4j-driver').v1; 

var driver = neo4j.driver("bolt://localhost", neo4j.auth.basic("neo4j", "password")); 
var session = driver.session(); 

//============Load Memory Tables========================= 
router.getallDealers=function(callback) { 
    session 
    .run ("MATCH (user:Dealer) RETURN user") 
    .then (function(result) 
     { 
     if (!result.records[0]) 
      { 
      console.log("No Dealers Found"); 
      session.close(); 
      if (typeof callback==="function") { 
       return callback(null,false,result); 
       } 
      }  // end of if not found 
     else 
     { 
      console.log("Dealer Found"); 
      session.close(); 
      if (typeof callback === "function") 
      { 
      return callback(null, true, result); 
      } 
     } 

     // or close session here?? 
     }) //end of .then block 
    .catch(function(err) 
     { 
     console.log("DB call error: "+err); 
     });   //.then block 
}  //end of get dealers 
のサンプルであります

答えて

0

まず、各ファイルがmoduleであることを理解する必要があります。

あなたのアプリは、node app.jsのような単一のjsファイル(モジュール)を実行することから始まります。

1つのモジュールは別のモジュールと別のモジュールをロードすることができます。 フォルダー構造は、オーダー自体に影響しません。それはあなたのコードとモジュールをどのような順序でロードするかによって異なります。同期コードはあなたが書いた順序で実行されますが、非同期コードは将来実行されるため、コード内で何が起こるかを理解するにはevent loopを理解する必要があります。

あなたが与えた小さな文脈から、私はあなたがそれに接続する前にあなたのデータベースを照会しようとしたかもしれないと思います。あなたのコードは表示されませんが、接続先(app.jsファイルなど)に関係なく発生します。

+0

....私はイベントループとノードの非同期性を理解していると思います...その部分は大丈夫です。私が保証しようとしているのは、私が呼び出す各クエリが別のDB接続を試みないということです。どうすればそのことを確認できますか?なぜdbクエリと同じモジュールでdb connectを実行しなければならないのですか?それとも、私はする必要はないと言いますか? – MichaelE

+0

@Peter .....もし私があなたを理解していれば....非同期を実行するためにロードされたとき、app.jsと実際のdbクエリモジュールの早い段階でDBを接続するだけのモジュールをロードできるはずです。 dbはすでに接続されています。 Tuis – MichaelE

+0

@MichaelEはあなたの実際のコードを見なければならないと答えました –

関連する問題