【问题标题】:Node javascript session undefined request or property节点 javascript 会话未定义的请求或属性
【发布时间】:2013-11-15 18:58:18
【问题描述】:

我在使用 nodejs 和会话时遇到了一个奇怪的问题。 我已经将问题追溯到 session.save 函数,

TypeError: Cannot read property 'sessionStore' of undefined 
at Session.save (C:\Program Files\nodejs\node_modules\express\node_modules\connect\lib\middleware\session\session.js:65:11);

//Code in connect session module where this.req gets its value
var Session = module.exports = function Session(req, data) {

  Object.defineProperty(this, 'req', { value: req });
  Object.defineProperty(this, 'id', { value: req.sessionID });
  if ('object' == typeof data) utils.merge(this, data);
  console.log("SESSION CREATED", typeof this.req, "VS" , typeof req);
  //outputs SESSION CREATED undefined VS object
};

//The session.save function, here the this.req is undefined and it causes the error
Session.prototype.save = function(fn){
  this.req.sessionStore.set(this.id, this, fn || function(){});
  return this;
};

这可能是什么原因造成的?

快速编辑:

仅当我需要外部 api(box2d) 文件时才会出现此问题。 var Box2D = 需要('./box2d.js'); 该文件有效,因为它带有一个工作演示,并且它也适用于我的代码,但是在重新启动节点之后......由于某种原因我中断了会话。套接字仍然有效。

文件在这里(缩短的谷歌文档) box2D 我在其中搜索了可能发生冲突但没有出现任何可疑的关键字。 那个文件很大……会不会有问题?

【问题讨论】:

  • 是否有可能由于某种原因您的 utils.merge() 函数正在杀死您正在分配的 req 属性?
  • 我会检查数据包含的内容,但此代码 100% 来自节点核心,所以它不是我的代码...除了 console.log ofc 数据以“未定义”形式注销,所以那条线根本不应该运行
  • utils.merge() 来自节点核心?我在文档中没有看到它:nodejs.org/api/util.html
  • session 和 utils 都来自基于节点的 Connect 框架......并且被广泛使用。所以不能这样。我用更多信息更新了我的帖子,这可能会有所帮助
  • 我对节点进行了更新,从 v0.8 到 10,现在这个错误更加离奇。现在像这样的一行 console.log("Some text");触发错误“无法调用未定义的方法'write'”并且仅当我包含原始帖子中链接的文件时才会再次发生这种情况。怎么会冲突?

标签: javascript node.js session box2d connect


【解决方案1】:

中断连接的是defineProperty(在Box2D 中)的自定义实现。 试试这个小提琴,然后删除 defineProperty 函数。

您将首先收到未定义的警报。 删除代码后,它会提醒 [objectObject](应该如此)。

if(!(Object.prototype.defineProperty instanceof Function)
      && Object.prototype.__defineGetter__ instanceof Function
      && Object.prototype.__defineSetter__ instanceof Function)
   {
      Object.defineProperty = function(obj, p, cfg) {
         if(cfg.get instanceof Function)
            obj.__defineGetter__(p, cfg.get);
         if(cfg.set instanceof Function)
            obj.__defineSetter__(p, cfg.set);
      }
   }

http://jsfiddle.net/nqUrQ/

虽然没有在节点环境中测试过。

【讨论】:

  • 太棒了!删除它几乎可以修复它。现在我只需要看看它是否以及如何影响 box2d。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 2017-10-25
  • 1970-01-01
  • 2017-01-16
  • 2017-04-27
相关资源
最近更新 更多