提问者:小点点

如何使nodejs中的模块成为非静态的?


我有一个带有节点js和静态角度文件的应用程序。我需要nodejs检查内部带有授权令牌的请求头。因此,我有一个模块,它检查令牌是否有效,如果是,用户可以访问以下所有的get-method。这在app.use(检查令牌的模块)中工作得很好。

但是我还需要用户的电子邮件地址,这是写在解码的令牌中的。这个电子邮件地址必须能在Angular应用程序中访问。为此,我植入了一个get-method,它可以被Angular应用程序调用并发送回电子邮件。

我的问题是,如何以安全的方式获得电子邮件地址。现在我已经编辑了这个模块并添加了另一个函数。模块的伪代码:

Var电子邮件=“”;module.exports=verfiyToken(req,rsp,next){

  • 获取请求参数的标头
  • 检查令牌
  • 如果令牌有效,则设置email=RealEmailFromToken

//这个不能存在,否则就不会调用index.js的以下get-method。如果(next存在),则调用next()

回报无关紧要,因为还没有达到;}

现在同一个模块中的另一个函数module.exports=getEmail(){

//Email has the right value if the function verifyToken was successful once. That is always the case, because if not, then getEmail can never be called.
Return email;

}

这对我有效,但我认为模块是一个单例。如果用户A成功呼叫并在网站中,我看到了问题。在下一步中,用户B成功地调用该网站,并拥有一个经过验证的令牌。现在变量“email”具有用户B的电子邮件地址。如果用户A现在调用Angular中的一个组件,在这里进行电子邮件调用,那么他将得到用户B的电子邮件。

你明白我的问题了吗?如何让模块为每个会话创建一个实例?

为英国人感到抱歉。如果你有什么问题,我会回答的。

最诚挚的问候


共1个答案

匿名用户

闭包是你的朋友。

听起来你想做这样的事。考虑sample-module.js,它导出一个返回函数的函数:

// Anything declared here is static and visible across all modules
const moduleGlobalStatic = 'this value is shared by all.';

exports = module.exports = function( a, b, c ) {
  // stuff declare here is invocation-specific

  let invocationSpecificStatic = `this is unique to each invocation - a:${a}, b:${b}, c:${c}`;

  function doSomething( x , y , z ) {
    // do something with a, b, c, x, y, and z
  }

  return doSomething;
}

用法很简单:

常量doSomething1=require('sample-module')(1,2,3);常量doSomething2=require('sample-module')('alpha','bravo','charlie');

doSomething()已经关闭了上面不同范围中可见的变量。

>

  • DoSomething1DoSomething2共享ModuleGlobalStatice

    DoSomething2DoSomething2分别为ABC以及InvocationSpecificStatice获取各自的值。

    每次调用DoSomething1DoSomething2时,它们都会获得自己的XYZ副本。但是,它们的abcInvocationSpecificState变量在每次调用时都是不变的(除非它们在执行期间修改它们)。