【问题标题】:NodeJS procedure execution flowNodeJS 程序执行流程
【发布时间】:2017-02-14 05:01:04
【问题描述】:

我是 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

问题与数据库有关。由于数据库连接不在 app.js 文件中,而是在模型文件夹中的 .js 文件中,在什么时候建立了数据库连接?每次进行数据库查询时都会建立连接吗?

我希望发生的是,数据库连接只进行一次并保持连接,直到应用程序终止。我尝试将数据库连接放在 app.js 中,但是当我尝试数据库查询时出现错误,所以我必须将数据库连接放在与数据库查询相同的文件中......不知何故这对我来说似乎是错误的。谁能解释节点如何处理此流程?....将不胜感激。

编辑:这是代码示例

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

【问题讨论】:

    标签: node.js


    【解决方案1】:

    首先,您必须了解每个文件都是module

    您的应用程序从运行单个 js 文件(模块)开始,例如 node app.js

    一个模块可以加载另一个模块,以此类推。 您的文件夹结构本身对订单没有任何影响。这完全取决于您的代码以及加载模块的顺序。虽然您的同步代码将按照您编写的顺序运行,但您的异步代码将在未来运行,您需要了解 event loop 才能了解代码中发生的情况。

    从您提供的小上下文中,我猜您可能会在连接到数据库之前尝试查询数据库。我没有看到您的代码,但无论您连接到哪里(app.js 文件或其他文件),它都可能发生。

    【讨论】:

    • ....我想我了解事件循环和节点的异步性质...那部分没问题。我要确保的是我调用的每个查询都不会尝试另一个数据库连接....我怎样才能确保这一点。为什么我必须在与 db 查询相同的模块中执行 db connect?....还是你说我不需要?
    • @Peter.....所以如果我理解你的话....我应该能够加载一个只在 app.js 早期进行数据库连接的模块和实际的数据库查询加载模块以异步执行时,数据库将已连接。图斯
    • @MichaelE 回答我必须查看您的实际代码
    • @MichaelE 谢谢。你能告诉我哪些设置有效,哪些无效?我猜你发布的是一个 sn-p,因为我看到缺少回调和模块导出。你能告诉我当你在 app.js 中连接时,你是如何尝试在 user.js 中查询经销商的吗?
    • 是的,它是一个 sn-p....如果您查看 var(s) 下方的 app.js,您会看到一组注释掉的连接到数据库的代码。 ... user.js 中的相同代码。 app.js 中加载经销商的查询是:loaddealerTable(); //首先调用app.js中间件部分的DB。当我在 app.js 中使用代码时,出现错误。我将重新运行代码并尝试重现确切的错误。
    猜你喜欢
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2019-05-11
    相关资源
    最近更新 更多