gpt4 book ai didi

node.js - Express中中间件功能的正确使用方法

转载 作者:太空宇宙 更新时间:2023-11-03 22:20:16 25 4
gpt4 key购买 nike

您好,我正在使用 Express 和 Node js 创建一个代理端点,我让它可以正确地处理一个 get 请求,但我想设置多个 get/post 请求端点,并想知道我下面所做的是否是正确的携带方式来实现其他端点,我对 NodeJS 和 Express 还很陌生。

我尝试过的是重用

app.use(validateFirebaseIdToken);

然后app.use(new functionname)在我调用新的get Endpoint之前,我需要在每个bigQuery方法中重用decodedIDToken变量,请记住,我将有很多不同的bigQuery查询方法正在创建以获取最终用户的数据

var express = require('express')`
var app = express()

const validateFirebaseIdToken = async (req, res, next) => {`
console.log('Check if request is authorized with Firebase ID token');

if ((!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) &&!(req.cookies && req.cookies.__session)) {
console.error('No Firebase ID token was passed as a Bearer token in the Authorization header.',
'Make sure you authorize your request by providing the following HTTP header:',
'Authorization: Bearer <Firebase ID Token>',
'or by passing a "__session" cookie.');
res.status(403).send('Unauthorized');
return;
}

let idToken;
if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {
console.log('Found "Authorization" header');
// Read the ID Token from the Authorization header.
idToken = req.headers.authorization.split('Bearer ')[1];
} else {
// No cookie
res.status(403).send('Unauthorized');
return;
}

try {
const decodedIdToken = await admin.auth().verifyIdToken(idToken);
console.log('ID Token correctly decoded', decodedIdToken);
req.user = decodedIdToken;
next();
return;
} catch (error) {
console.error('Error while verifying Firebase ID token:', error);
res.status(403).send('Unauthorized');
return;
}
};

const runDailyCategorybigQuery = async (req, res, next) => {

const query = `select count(string_field_3) as Categories, Month(date_field_2) as Month from test.testing_api group by Month`;

const options = {
query: query,
// Location must match that of the dataset(s) referenced in the query.
location: 'US',
useLegacySql: true,
};

// Run the query as a job
const [job] = await bigquery.createQueryJob(options);
console.log(`Job ${job.id} started.`);
console.log(`ID ${req.user.user_id}`);

// Wait for the query to finish
const [rows] = await job.getQueryResults();
res.query = rows;
console.log('Rows:');
rows.forEach(row => console.log(row));
next();

};

const runCategoryMonthsbigQuery = async (req, res, next) => {

const query = `select count(string_field_3) as Categories, Month(date_field_2) as Month from test.testing_api group by Month`;

const options = {
query: query,
// Location must match that of the dataset(s) referenced in the query.
location: 'US',
useLegacySql: true,
};

// Run the query as a job
const [job] = await bigquery.createQueryJob(options);
console.log(`Job ${job.id} started.`);
console.log(`ID ${req.user.user_id}`);

// Wait for the query to finish
const [rows] = await job.getQueryResults();
res.query = rows;
console.log('Rows:');
rows.forEach(row => console.log(row));
next();

};
app.use(validateFirebaseIdToken);
app.use(runDailyCategorybigQuery);
app.get('/getCategories', (req, res) => {
res.json(res.query);
});

//what im thinking of doing
app.use(validateFirebaseIdToken);
app.use(runCategoryMonthsbigQuery);
app.get('/getCategoriesMonth', (req, res) => {
res.json(res.query);
});

最佳答案

您列出的“我正在考虑做什么”将添加相同的中间件两次(对于 validateFirebaseIdToken)。这不是必需的,因为中间件将在每个请求上调用,因此您应该只添加一次。

第二个问题是您将请求处理程序视为中间件。由于每个请求都会被所有中间件看到(只要它们调用下一个),那么您将运行两个查询,第二个查询将覆盖第一个查询。

将两个查询中间件函数移至请求处理程序中。例如:

const runDailyCategorybigQuery = async (req, res) => {
...
res.json(res.query);
}

app.get('/getCategories', runDailyCategorybigQuery);

关于node.js - Express中中间件功能的正确使用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57030728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com