javascript - 对于每个指定的(节点 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 - 每次用户填写表单时,我都需要拥有可通过所有模块使用的新全局对象,以便他们可以更新其中的数据。 旧的全局对象数据不得污染 - 当我在本地主机上打开另一个浏览器并填写表单时,应用程序将仅使用这些新数据,并且不会将旧数据与新数据混合在一起。
知道如何解决吗?感谢您提供任何帮助/指导/链接。
解决方案
我可能理解不正确,但您似乎可以使用某种形式的“id”(也许是 socket.io id)。基本上,而不是 global = {data} 有 global [id] = {data},然后你的每个模块都会传递这个 id,它们可以用来引用正确的数据。您可以在每个模块的顶部有类似的东西var globalData = global[id];
然后您所要做的就是将“global”的每个实例重命名为“globalData”。
如果我误解了什么,请告诉我!
推荐阅读
- amazon-web-services - ecs集群在实际应用中意味着什么?
- php - 作曲家缓存不适用于 bitbucket 管道构建
- php - Wordpress 在导入帖子时修改内容
- python - 在 mac os Catalina 中不允许使用 keyboard.is_pressed()
- db2 - DB2 执行不相关查询的时间过长
- python - heroku 在每次部署期间不断安装 django 包
- c# - 如何在没有任何硬编码连接字符串的情况下在我的 DbContext 中设置 OnConfiguring 方法?
- algorithm - 求币找零问题动态规划解的思考过程
- c++ - 为什么可以在头文件中定义类?
- android - Android 警报对话框不显示是怎么回事?