javascript - 避免传递请求对象

标签 javascript node.js express reactjs react-router

我正在编写一个 React 应用程序(Express 服务器),它使用共享(“同构”)代码库在客户端+服务器上呈现。在某些情况下,当服务器是渲染器时,我想访问请求对象,而不必到处传递它。由于 Node 一次响应一个请求,因此利用缓存变量并确保在发送响应之前重置它不是安全吗?

这可行,但有人可以告诉我为什么这是一个好主意还是一个坏主意?...

server.js

var r = require('./request-store');
app.use(function(req, res, next) {
  r.set(req);
  next();
});

var resolve = require('./resolve');
// ...deferring to react router for client / server routing
app.use(function(req, res) {
  resolve().then(function(data) {
    r.set(null);
    res.render('index', { data: data });
  });
});

request-store.js

var r = null;
module.exports.set = function(req) { r = req; };
module.exports.get = function() { return r; };

resolve.js

var r = require('./request-store');
module.exports = function() {
  return new Promise(resolve, reject) {
    if (isServer) {
      console.log(r.get());
      resolve();
    } else if (isClient) {
      resolve();
    }
  }
};

最佳答案

但是如果您同时收到来自不同用户的两个请求,会发生什么情况?第一个请求将被缓存,第二个请求将覆盖第一个用户的请求。同时假设您正在执行一些 IO 并且需要在请求完成后访问该请求,那么第一个用户的请求对象将已经被第二个用户的请求覆盖。总的来说,这样做是非常危险的。最好的方法是使用某种内存键值存储,但您仍然需要以某种方式传递键。

关于javascript - 避免传递请求对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28047266/

相关文章:

javascript - 新的 Office 2013 Javascript API 限制

javascript - 在 Node.JS 中导出多个对象

node.js - async/await 似乎不起作用 NodeJS Passport 重置密码

javascript - 为什么我的对象从 char 拆分为 char?

javascript - 检查 req.body 是否为空不适用于express

javascript - 如何使参数化 Express 路由在带或不带尾部反斜杠的情况下工作?

javascript - 简单的 js slider ,读取 ofssetX 使处理程序跳跃

javascript - 使用 AJAX 和 PHP 检查用户是否存在

node.js - Socket.io如何在本地服务器上创建文件运行时

node.js - lwip.open 在 mongoose findOne 之后不起作用