全局变量导致Node.js索引文件崩溃

时间:2018-07-02 06:23:49

标签: node.js ejs

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

trim()

我在这里使用它:

ctype_space()

在第一次加载时,它在我的视图中来回运行时效果很好,但是一旦刷新几次,它就会崩溃并说“ mobs undefined”:这是完整的错误日志:

if (empty($string) || preg_match("/^[\pZ\pC]+$/u", $string)) {

我只是不明白。我不知道它在大多数情况下是如何工作的,然后经过几次刷新后,突然间突然崩溃了。

2 个答案:

答案 0 :(得分:1)

这里的问题是执行顺序不能保证,您可以在查询完成之前调用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.
     })
});

答案 1 :(得分:0)

而不是使用这种方法来全局保存和检索数据。创建一个单独的地图,该地图将存储在当前会话中,并创建一条要在其中显示该数据的路线。

map.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);
})

注意:这里'main'是您的main.ejs文件。