javascript - 如何为每个指定(node env,express fr)路由发布请求创建可以变异并可通过所有模块使用的全局 obj 实例?

标签 javascript node.js express module routes

作为一名新手,我开始“开发”一些应用程序。这个想法是用户填写表单,然后我在其他站点的帮助下改变它(表单)数据,最后在 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 - 每次用户填写表单时,我都需要拥有可通过所有模块使用的新全局对象,以便他们可以更新其中的数据。 旧的全局对象数据不得污染 - 当我在本地主机上打开另一个浏览器并填写表单时,应用程序将仅使用这些新数据,并且不会将旧数据与新数据混合在一起。

知道如何解决这个问题吗?感谢您的任何帮助/指导/链接。

最佳答案

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

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

关于javascript - 如何为每个指定(node env,express fr)路由发布请求创建可以变异并可通过所有模块使用的全局 obj 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58878463/

相关文章:

Javascript regEx 删除除特殊字符之外的所有括号

javascript - HTML 表单操作和提交问题

javascript - 如何使用 axios 编辑和更新页面的 html?

node.js - 如何从 Nest.js 连接到 Heroku Postgres?

node.js - Redis docker-compose 与 Nodejs - 连接 ENOENT

javascript - 如何将结构样式添加到 jquery 插件

node.js - Jest 卡在 i18n.configure() 中

javascript - 如何将数据从 express.js 传递到与 html 页面相关的 Javascript 代码

javascript - Expressjs 使用route.render 传递本地变量

javascript - D3 强制模拟和拖动,什么是node.fx/node.fy?