【问题标题】:Call a router WITHIN Nodejs after a route has been called调用路由后在 Nodejs 内调用路由器
【发布时间】:2021-08-16 04:45:32
【问题描述】:

我使用 Expressjs 和 Auth0 API 进行身份验证,使用 ReactJs 进行客户端。 由于 Auth0 API(与他们的团队交谈)的限制,我将更新的用户详细信息发送到我的后端,然后使用 app.set() 以便能够在另一条路线中使用 req.body。 在 app.post() 路由被命中后,我需要自动调用 app.patch() 路由。 最终目标是用户数据将被更新并显示在客户端。

const express = require('express');
const cors = require('cors');
const path = require('path');
const app = express();
require('dotenv').config()
const { auth } = require("express-openid-connect");


app.use(express.json());
app.use(cors());
app.use(express.static(path.join(__dirname, 'build')));

app.use(
  auth({
    issuerBaseURL: process.env.AUTH0_ISSUER_BASE_URL,
    baseURL: process.env.BASE_URL,
    clientID: process.env.AUTH0_CLIENT_ID,
    secret: process.env.SESSION_SECRET,
    authRequired: false,
    auth0Logout: true,
  })
);


app.get('/', async (req, res) => {
  res.sendFile(path.join(__dirname, 'build', 'index.html'));
  
});


app.get('/api', async (req, res) => {

  const stripe = require('stripe')(`${process.env.REACT_APP_Stripe_Live}`);
  const invoice = await stripe.invoices.list({
    limit: 3,
  });
  res.json(invoice);
});

app.post('/updateuser', (req, ) => {
   app.set('data', req.body);
  })
 
app.patch(`https://${process.env.AUTH0_ISSUER_BASE_URL}/api/v2/users/:id`,(req,res) => {
  let val = app.get('data');
 req.params =  {id: val.id};
  console.log(req.params);
}) 



app.listen(process.env.PORT || 8080, () => {
  console.log(`Server listening on 8080`);
});

【问题讨论】:

    标签: javascript node.js reactjs express auth0


    【解决方案1】:

    我建议您从app.patch() 内部获取代码并将其变为可重用函数。然后可以直接从app.patch() 路由或从您想要执行相同功能的其他路由调用它。只需决定该函数的哪个接口适用于两者,将其设为单独的函数,然后您可以从两个位置调用它。

    出于某种原因(我不太了解,但似乎很多人都遇到过),人们忘记了路由内部的代码也可以像任何其他 Javascript 代码一样放入函数中并共享。我猜人们似乎将路由本身视为一个固定单元,而忘记了它仍然可以分解为组件以及与其他代码共享的组件。


    警告。另外一点。你的这个评论听起来很不对:

    然后使用 app.set() 可以在另一个路由中使用 req.body

    req.body 属于一个特定用户。 app.set() 对您的服务器是全局的(所有用户的请求都访问它)。因此,您试图将一个用户的临时状态存储在本质上是全局的。这意味着碰巧正在执行类似操作的多个用户的请求将破坏/覆盖彼此的数据。或者更糟的是,一个用户的数据会意外地变成其他用户的数据。您根本无法以这种方式对多用户服务器进行编程。

    解决此问题的常用方法是 1) 重新设计流程,这样您就不必在服务器上保存状态(如果可能,无状态操作通常更好)或 2) 使用特定于用户的会话(例如express-session) 并将临时状态保存在用户会话中。然后,为每个用户单独保存,一个用户的状态不会覆盖另一个用户。

    如果app.set() 的这种用法是为了解决执行.patch() 路由的原始问题,那么只需调用共享函数并将req.body 数据直接传递给该共享函数即可解决问题。然后,您不必将它塞到某个地方,以便以后的路线可以使用它。您只需执行您想要的功能并将所需的数据传递给它。

    【讨论】:

    • 感谢您非常彻底的回答。我应该澄清一下,这对我自己来说只是一个最小的可行产品,所以我专注于让它工作,然后回去重新设计。我这样说是因为我将要实现表达式会话。如果我理解正确,我可以让 app.patch() 并在路由内部调用一个处理我想要的函数?
    • @AS10 - 是的,您可以让两条路由只调用同一个函数,并让每条路由将适当的数据作为参数传递给共享函数。我不会实现一个只能为一个用户工作的 MVP。 MVP 有适当的捷径,但是做一些只对一个用户有用的事情有点远,因为你通常期望多个用户能够使用 MVP,这样你就可以得到早期的反馈。
    • 感谢您的反馈。我现在将实现 express-sessions 并创建一个共享函数。
    • @AS10 - 如果我理解正确的话,这个问题可能完全可以通过没有 express-session 的共享函数来解决。不过,您可能需要 express-session 来处理其他事情。
    • 我很可能需要使用它,因为我将数据发送到一个端点,我需要将它传递到另一个端点。
    猜你喜欢
    • 1970-01-01
    • 2018-09-27
    • 2017-10-22
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    相关资源
    最近更新 更多