为什么我的 Vercel 无服务器函数无法读取生产中的请求标头?

问题描述 投票:0回答:1

我正在开发一个 Vercel 项目,其中包含本地开发环境(使用 vercel dev)和部署在 Vercel 无服务器平台上的生产环境。

我需要通过 GET 请求中的请求标头发送凭据(电子邮件、密码和 ID)。这在我的本地环境中完美运行,但在生产中,我收到以下错误:

Error: TypeError: Cannot read properties of undefined (reading 'email')
    at module.exports (/var/task/api/user/user.js:16:16)
    at Server.<anonymous> (/opt/rust/nodejs.js:2:11027)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Server.<anonymous> (/opt/rust/nodejs.js:9:6760)

错误发生在这里:

  let email, pwd, userId;

  try {
    email = req.body.email || req.headers["email"] || req.headers?.email || null;
    pwd = req.body.pwd || req.headers["pwd"] || req.headers?.pwd || null;
    userId = req.body.participantId || req.headers["id"] || req.headers?.id || null;
  } catch (err) {
    console.error("Error parsing input:", err);
    return res.status(400).json("Bad Request");
  }

客户端GET请求:

axios.get(`/api/user/user/`, {headers: { "email": email, "pwd": pwd, id: participantId }}, { withCredentials: true })
                    .then((res) => res.data.fullName)
                    .catch((err) => {
                        console.log(err);
                        return "Error loading participant";
                    })

我尝试的调试步骤:

  1. 在本地和产品中记录 req.headers
    • 我看到电子邮件、密码和 ID 都有正确的值
  2. 我确保标头名称在无服务器功能中不区分大小写
  3. 验证 Axios 是否正确发送标头

观察结果:

  • 标头正在发送到后端
  • 在产品中,无服务器功能由于某种原因无法访问它们
  • 在本地开发环境中它可以正常工作

问题:

  1. 为什么 Serverless 函数在生产环境中读取 header 失败?
  2. Vercel 的无服务器环境是否存在已知问题 剥离某些标头?
  3. 如何确保标头(电子邮件、密码、 id)在生产中正确传递和读取?

预先感谢您的帮助

javascript get vercel
1个回答
0
投票

在此代码中:

let email, pwd, userId;

try {
   email = req.body.email || req.headers["email"] || req.headers?.email || null;
   pwd = req.body.pwd || req.headers["pwd"] || req.headers?.pwd || null;
   userId = req.body.participantId || req.headers["id"] || req.headers?.id || null;
} catch (err) {
   console.error("Error parsing input:", err);
   return res.status(400).json("Bad Request");
}

您正在尝试访问

req.body.email
req.body.pwd
req.body.pwd
作为变量赋值的第一部分。如果您不使用 body-parser 来解析传入的
POST
请求,则
req.body
将无法访问。这意味着当您尝试
req.body.email
时,它会立即抛出错误。

您正在使用

GET
发送
axios
请求,因此您可以删除
req.body.xyz
部分,或者如果您认为可以在应用程序中进一步使用
|| null
请求,请将它们移到
POST
默认值之前发展。

在第一个实例中,我只会重构您的代码以删除它们,如下所示:

let email, pwd, userId;

try {
   email = req.headers["email"] || req.headers?.email || null;
   pwd =  req.headers["pwd"] || req.headers?.pwd || null;
   userId = req.headers["id"] || req.headers?.id || null;
} catch (err) {
   console.error("Error parsing input:", err);
   return res.status(400).json("Bad Request");
}
© www.soinside.com 2019 - 2024. All rights reserved.