2017-02-11 6 views
0

Ich bin neu bei Nodejs und komme auch von einem prozeduralen Sprachhintergrund, so dass ich den Ausführungsfluss meines Codes kennen muss. Ich habe eine allgemeine Frage zum Ablauf von Nodejs-Prozeduren. Dies ist das Szenario:Ablauf der NodeJS-Prozedurausführung

Die Code-Struktur:

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 

Die Frage bezieht sich auf die Datenbank. Da sich die DB-Verbindung nicht in der Datei app.js, sondern in einer .js-Datei im Modellordner befindet, an welchem ​​Punkt wird die DB-Verbindung hergestellt? und wird jedes Mal eine Verbindung hergestellt, wenn eine DB-Abfrage durchgeführt wird?

Was ich hoffe, ist, dass die DB-Verbindung einmal gemacht wird und verbunden bleibt, bis die App beendet wird. Ich habe versucht, die DB verbinden in app.js, aber ich bekomme einen Fehler, wenn ich eine DB-Abfrage versuchen, so muss ich die DB verbinden in der gleichen Datei wie die DB-Abfragen ...... Irgendwie scheint das falsch zu mir. Kann jemand erklären, wie Knoten mit diesem Fluss umgehen? .... wird jede Hilfe wertschätzen.

EDIT: Hier ist ein Beispiel für den Code

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 

Antwort

0

Zunächst einmal müssen Sie verstehen, dass jede Datei eine module ist.

Ihre App beginnt mit der Ausführung einer einzelnen js-Datei (Modul) wie node app.js.

Ein Modul kann ein anderes Modul laden und ein anderes und so weiter. Ihre Ordnerstruktur hat selbst keine Auswirkung auf die Bestellung. Alles hängt von Ihrem Code ab und in welcher Reihenfolge laden Sie Module. Während Ihr Synchronisierungscode in der Reihenfolge läuft, in der Sie ihn schreiben, wird Ihr Async-Code in Zukunft ausgeführt und Sie müssen die event loop verstehen, um zu verstehen, was in Ihrem Code passiert.

Aus dem kleinen Kontext, den Sie angegeben haben, vermute ich, dass Sie möglicherweise versucht haben, Ihre Datenbank abzufragen, bevor Sie sich mit ihr verbunden haben. Ich sehe Ihren Code nicht, aber er kann unabhängig davon auftreten, wo Sie eine Verbindung herstellen (Datei "app.js" oder eine andere).

+0

.... Ich denke, ich verstehe die Ereignisschleife und die asynchrone Natur des Knotens ... dieser Teil ist in Ordnung. Ich versuche sicherzustellen, dass jede Abfrage, die ich anrufe, keine andere db connect versucht. Wie kann ich das sicherstellen? Warum muss ich die db connect im selben Modul wie die db-Abfrage ausführen? .... Oder sagst du, dass ich nicht muss? – MichaelE

+0

@Peter ..... also wenn ich dich verstehen soll .... sollte ich in der Lage sein ein Modul zu laden, dass nur eine DB früh in app.js verbinden und die eigentlichen DB Query Module beim Laden asynchron ausgeführt werden db wäre bereits verbunden. Tuis – MichaelE

+0

@MichaelE zu beantworten, dass ich Ihren tatsächlichen Code sehen müsste –