最简单的Node.js请求序列化方法

Simplest approach to Node.js request serialisation

本文关键字:序列化 方法 请求 js Node 最简单      更新时间:2023-09-26

我遇到了一个经典的异步/并发问题,这是人们在Node.js中编写服务时遇到的问题。我有一个对象,它从RDBM中获取一些数据以响应请求,并在行抓取完成时发出fin事件(使用EventEmitter)。

如您所料,当服务的调用者对它进行几个几乎同时的调用时,将以不可预测的顺序返回行。fin事件将在不符合调用函数对产生它们的请求的理解的行中触发。

这是我正在做的(为了相关性而简化):

var mdl = require('model.js');
dispatchGet: function(req, res, sec, params) {
    var guid = umc.genGUID(36);
    mdl.init(this.modelMap[sec], guid);
    // mdl.load() creates returns a 'new events.EventEmitter()'
    mdl.load(...).once('fin', 
      function() { 
        res.write(...);
        res.end();
      });
 }

一个简单的测试表明,mdl.guid经常不对应于guid

我本以为在mdl.load()函数内创建一个new events.EventEmitter()会通过为每个请求创建一个离散的EventEmitter来解决这个问题,但显然情况并非如此;我认为对象持久化的相同规则适用于它,就像适用于任何其他对象一样,而不考虑new

我是一个C程序员的背景:我当然可以想出我自己的方案来关联这些回复与他们的请求,使用一些循环队列或哈希方案。然而,我猜这个问题已经解决了很多次了。我的研究揭示了许多关于如何最好地处理这个问题的观点——各种排队实现,Futures,等等。

我想知道的是,这里最简单的异步流控制方法是什么?如果没有必要的话,我不想陷入依赖关系的巨大范式转变中。对于哪个第三方模块是最好的,是否有一个相对简单、规范、明确的解决方案,和/或广泛的共识?

可能是你的model.js看起来像这样吗?

module.exports = {
  init : function(model, guid) {
    this.guid = guid;
    ...
  }
};

你必须意识到你传递给module.exports的对象是一个共享对象,从某种意义上说,每个运行require("model.js")的其他模块都将接收到对同一对象的引用

所以每次运行mdl.init()时,该对象的guid属性都会发生变化,这就解释了你的注释"…一个简单的测试表明,mdl。Guid通常不对应于Guid "

这真的取决于你的具体实现,但我认为你会想用一个类来代替:

// model.js
var Mdl = function(model, guid) {
  this.guid  = guid;
};
Mdl.prototype.load = function() {
  // instantiate and return a new EventEmitter.
};
module.exports = Mdl;
// app.js
var Mdl = require('model.js');
...
var mdl = new Mdl(this.modelMap[sec], guid);
mdl.load(...)