代码之家  ›  专栏  ›  技术社区  ›  William

导致nodejs索引文件崩溃的全局变量

  •  1
  • William  · 技术社区  · 6 年前

    所以,我声明了一个变量,我应该可以在任何地方使用它:

    // Global Variables
    app.use(function (req, res, next) {
    
      // Mob Database
      db.query('SELECT * FROM mobs').then(results => {
        req.mobs = results;
        res.locals.mobs = req.mobs;
      });
    
      next();
    });
    

    这里是我使用它的地方:

    <select id="monster">
     <% for (var i = 0; i < mobs.length; ++i) { %>
      <option name="mobs" value="<%= mobs[i].id %>"><%= mobs[i].name %></option>
     <% } %>
    </select>
    

    它在第一次加载时工作正常,在我的视图中来回切换,但是一旦我刷新几次,它就会崩溃并说“mobs is undefined”:以下是完整的错误日志:

        74|                 <form name="mobget">
        75|                   <select id="monster">
     >> 76|                   <% for (var i = 0; i < mobs.length; ++i) { %>
        77|                       <option name="mobs" value="<%= mobs[i].id %>"><%= mobs[i].name %></option>
        78|                   <% } %>
        79|                   </select>
    
    mobs is not defined
        at eval (eval at compile (/home/kogadmin/www/node_modules/ejs/lib/ejs.js:618:12), <anonymous>:62:28)
        at returnedFn (/home/kogadmin/www/node_modules/ejs/lib/ejs.js:653:17)
        at tryHandleCache (/home/kogadmin/www/node_modules/ejs/lib/ejs.js:251:36)
        at View.exports.renderFile [as engine] (/home/kogadmin/www/node_modules/ejs/lib/ejs.js:482:10)
        at View.render (/home/kogadmin/www/node_modules/express/lib/view.js:135:8)
        at tryRender (/home/kogadmin/www/node_modules/express/lib/application.js:640:10)
        at Function.render (/home/kogadmin/www/node_modules/express/lib/application.js:592:3)
        at ServerResponse.render (/home/kogadmin/www/node_modules/express/lib/response.js:1008:7)
        at /home/kogadmin/www/server.js:112:9
        at Layer.handle [as handle_request] (/home/kogadmin/www/node_modules/express/lib/router/layer.js:95:5)
    

    我就是不明白。我不明白它在大部分时间里是如何工作的,然后在几次刷新之后,它突然崩溃了。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Terry Lennox    6 年前

    这里的问题是不能保证执行顺序,您可以在查询完成之前调用Next()。实际上,我们正在用db查询在next()中加速代码。

    我建议在查询完成后再打电话。例如

    // Global Variables
    app.use(function (req, res, next) {
    
        // Mob Database
        db.query('SELECT * FROM mobs').then(results => {
            req.mobs = results;
            res.locals.mobs = req.mobs;
    
            // Now it's safe to call next.
            next();
    
         }).catch((err) => {
             console.error('Error occurred during query: ', err);
             // Consider sending back a 500 here.
         })
    });
    
        2
  •  0
  •   Abhishek Singh    6 年前

    地图JS

    var hashmapSession = {};
    
    exports.sess = {
      set : function(key, value){
        hashmapSession[key] = value;
      },
      get : function(key){
        return hashmapSession[key];
      },
      delete : function(key){
        delete hashmapSession[key];
      },
      all : function(){
        return hashmapSession;
      }
    };
    

    res.locals 使用上面的地图。例如:

    var hashmap = require('./hashmap');
    app.use(function (req, res, next) {
      // Mob Database
      db.query('SELECT * FROM mobs').then(results => {
         if(results)
          hashmap.sess.set('global', results);
      });
    
      next();
    });
    

    app.get('/showData', function(req, res){
      var data = hashmap.sess.get('global');
      res.render('main', data);
    })
    

    注意:这里 是主.ejs文件。