调用路由后在 Nodejs 中调用路由器
Call a router WITHIN Nodejs after a route has been called
我正在使用 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`);
});
我建议您直接从 app.patch()
中获取代码并将其变成可重用的函数。然后它可以直接从 app.patch()
路由调用,也可以从您想要执行相同功能的其他路由调用。只需确定该函数的哪个接口对两者都适用,将其作为一个单独的函数,然后您就可以从两个地方调用它。
出于某种原因(我不太明白,但似乎很多人都遇到过),人们忘记了路由中的代码也可以像其他任何东西一样放入函数中并共享 Javascript 代码。我猜人们似乎将路由本身视为一个固定单元,而忘记了它仍然可以分解为组件,并且这些组件与其他代码共享。
警告。关于另一点。你的这条评论听起来很不对:
and then using app.set() to be able to use the req.body in another route
req.body
属于一个特定用户。 app.set()
对您的服务器是全局的(所有用户的请求都访问它)。因此,您试图在本质上是全局的情况下为单个用户存储临时状态。这意味着恰好在做类似事情的多个用户的请求将 trounce/overwrite 彼此的数据。或者更糟的是,一个用户的数据会不小心变成另一个用户的数据。你根本不能用这种方式编写多用户服务器程序。
通常的解决方法是 1) 重新设计流程,这样您就不必在服务器上保存状态(如果可能,无状态操作通常更好)或 2) 使用特定于用户的会话 (与 express-session
) 一样,并在用户会话中保存临时状态。然后,它为每个用户单独保存,一个用户的状态不会覆盖另一个。
如果 app.set()
的这种用法是为了解决执行 .patch()
路由的原始问题,那么只需调用共享函数并传递 req.body
数据即可解决问题直接到那个共享函数。然后,您不必将它放在某个地方,以便以后的路线可以使用它。您只需执行所需的功能并将所需的数据传递给它即可。
我正在使用 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`);
});
我建议您直接从 app.patch()
中获取代码并将其变成可重用的函数。然后它可以直接从 app.patch()
路由调用,也可以从您想要执行相同功能的其他路由调用。只需确定该函数的哪个接口对两者都适用,将其作为一个单独的函数,然后您就可以从两个地方调用它。
出于某种原因(我不太明白,但似乎很多人都遇到过),人们忘记了路由中的代码也可以像其他任何东西一样放入函数中并共享 Javascript 代码。我猜人们似乎将路由本身视为一个固定单元,而忘记了它仍然可以分解为组件,并且这些组件与其他代码共享。
警告。关于另一点。你的这条评论听起来很不对:
and then using app.set() to be able to use the req.body in another route
req.body
属于一个特定用户。 app.set()
对您的服务器是全局的(所有用户的请求都访问它)。因此,您试图在本质上是全局的情况下为单个用户存储临时状态。这意味着恰好在做类似事情的多个用户的请求将 trounce/overwrite 彼此的数据。或者更糟的是,一个用户的数据会不小心变成另一个用户的数据。你根本不能用这种方式编写多用户服务器程序。
通常的解决方法是 1) 重新设计流程,这样您就不必在服务器上保存状态(如果可能,无状态操作通常更好)或 2) 使用特定于用户的会话 (与 express-session
) 一样,并在用户会话中保存临时状态。然后,它为每个用户单独保存,一个用户的状态不会覆盖另一个。
如果 app.set()
的这种用法是为了解决执行 .patch()
路由的原始问题,那么只需调用共享函数并传递 req.body
数据即可解决问题直接到那个共享函数。然后,您不必将它放在某个地方,以便以后的路线可以使用它。您只需执行所需的功能并将所需的数据传递给它即可。