首页 > 解决方案 > 对于每个指定的(节点 env,express fr)路由发布请求,如何使全局 obj 的实例可以通过所有模块进行变异和可用?

问题描述

作为一个新手,我开始“开发”一些应用程序。这个想法是用户填写表单,然后我在另一个站点的帮助下对其(表单)数据进行变异,最后在 socket.io 的帮助下将其转换回用户

该过程可能需要几秒钟,因此我尝试使用 socket.io 部分传回数据 - 这样用户就可以开始浏览数据,而其余部分仍在计算或传输中。我什至为此添加了一些图表 - 这样当所有数据都被扔给他时,用户就会得到通知,这样他就可以浏览结果而无需任何进一步的更改/更新。

TL:DR - 然后概念工作正常,但作为一个新手,我无法正确维护我的代码并将其切割成碎片,因为现在使用这 5k 行完全是一场噩梦

想要修改代码的用户肯定会遇到包含它的问题,因此他们无法轻松使用它。

来自表单的代码是在这样的路由中接收的:

var express = require('express');
var app = express();
var router = express.Router();
var request = require('request');
var body_parser = require('body-parser');

var module1 = require('./module1.js');

router.post('/page', function(req, res) {

  // globalS object
  var globals = {
    a : 'a',
    b : 'b',
    c : 'c', // and so on...
    mutatedData1 = '',
    mutatedData2 = ''
  };

  // form data (from the form that action is set to "/page" and method is "post")
  var fomrData = req.body.form_input_name;

  // request to get first part of the data
  var dataMutation = request('https://www.facebook.com', function(err, resp, body) {
    if (resp.statusCode === 200) {
      globals.mutatedData1 = body.substr(0, 100);

      // page render (I'm using ejs template)
      res.render('page');

      // another request to get second part of the data
      var otherPageRequest = request('https://www.google.com', function(error, response, content) {
        globals.mutatedData2 = content.substr(0, 100);
      });


      // lets suppose thet here are more request, more calculation, more emits, recursion, loops, callbacks etc.
      // and this is going for 5 thousands lines of code...

      // so for example the next request I would like to make, could be placed in a module1, then the code could look cleaner and more friendly to the user that want to use it/modify it
    }
  });


});

module.exports = router;

所以我可以举一个例子,我可以如何将我的代码剪切到模块中,因为现在我什至不看代码或触摸它时都会感到头疼。

我已经尝试构建其余模块中所需的全局模块,但每个请求的用户只是将数据添加到全局对象(其中包含旧数据!),并且不要创建它的新实例 - 仅对于这个特定的要求。因此,数据的数量正在增长,但没有给出正确的结果。

TL:DR - 每次用户填写表单时,我都需要拥有可通过所有模块使用的新全局对象,以便他们可以更新其中的数据。 旧的全局对象数据不得污染 - 当我在本地主机上打开另一个浏览器并填写表单时,应用程序将仅使用这些新数据,并且不会将旧数据与新数据混合在一起。

知道如何解决吗?感谢您提供任何帮助/指导/链接。

标签: javascriptnode.jsexpressmoduleroutes

解决方案


我可能理解不正确,但您似乎可以使用某种形式的“id”(也许是 socket.io id)。基本上,而不是 global = {data} 有 global [id] = {data},然后你的每个模块都会传递这个 id,它们可以用来引用正确的数据。您可以在每个模块的顶部有类似的东西var globalData = global[id];然后您所要做的就是将“global”的每个实例重命名为“globalData”。

如果我误解了什么,请告诉我!


推荐阅读