NextJS生产环境报Path must be a string客户端异常
问题描述
此前从未遇到过此类错误。我在项目中维护了一个专门用于定义API调用方法的文件,最初通过读取环境变量拼接接口请求的基础地址:
/** * Prepended to request URL indicating base URL for API and the API version */ const VERSION_URL = `${process.env.NEXT_PUBLIC_API_BASE_URL}/${process.env.NEXT_PUBLIC_API_VERSION}`
由于环境变量存在加载异常的问题,我尝试做了临时兼容处理:当对应环境变量未定义时,使用硬编码URL作为兜底值,修改后的代码如下:
/** * Prepended to request URL indicating base URL for API and the API version */ const VERSION_URL = `${process.env.NEXT_PUBLIC_API_BASE_URL || 'https://hardcodedURL.com'}/${process.env.NEXT_PUBLIC_API_VERSION || 'v1'}`
在本地Docker容器中运行时,无论是开发模式还是生产构建模式,项目都能正常工作,但一旦将构建产物部署到线上生产环境,就会弹出应用错误页面,对应错误截图如下:
浏览器控制台输出如下错误日志:
framework-bb5c596eafb42b22.js:1 TypeError: Path must be a string. Received undefined at t (137-10e3db828dbede8a.js:46:750) at join (137-10e3db828dbede8a.js:46:2042) at J (898-576b101442c0ef86.js:1:8158) at G (898-576b101442c0ef86.js:1:10741) at oo (framework-bb5c596eafb42b22.js:1:59416) at Wo (framework-bb5c596eafb42b22.js:1:68983) at Ku (framework-bb5c596eafb42b22.js:1:112707) at Li (framework-bb5c596eafb42b22.js:1:98957) at Ni (framework-bb5c596eafb42b22.js:1:98885) at Pi (framework-bb5c596eafb42b22.js:1:98748) cu @ framework-bb5c596eafb42b22.js:1 main-f51d4d0442564de3.js:1 TypeError: Path must be a string. Received undefined at t (137-10e3db828dbede8a.js:46:750) at join (137-10e3db828dbede8a.js:46:2042) at J (898-576b101442c0ef86.js:1:8158) at G (898-576b101442c0ef86.js:1:10741) at oo (framework-bb5c596eafb42b22.js:1:59416) at Wo (framework-bb5c596eafb42b22.js:1:68983) at Ku (framework-bb5c596eafb42b22.js:1:112707) at Li (framework-bb5c596eafb42b22.js:1:98957) at Ni (framework-bb5c596eafb42b22.js:1:98885) at Pi (framework-bb5c596eafb42b22.js:1:98748) re @ main-f51d4d0442564de3.js:1 main-f51d4d0442564de3.js:1 A client-side exception has occurred, see here for more info: https://nextjs.org/docs/messages/client-side-exception-occurred re @ main-f51d4d0442564de3.js:1
我查看报错位置t (137-10e3db828dbede8a.js:46:750)对应的压缩混淆后源码,对应截图如下:
我完全无法理解该错误的触发逻辑:为什么已经对路径做了硬编码兜底,仍然会触发该客户端错误?生产构建后压缩混淆的代码可读性极差,导致问题定位十分困难。我初步检索相关问题得到的建议是升级相关依赖包,但错误提示过于模糊,我无法确定具体是哪个包引发的问题。
以下是VERSION_URL变量的大致使用方式:
/** * Send a get request to a given endpoint * * **Returns a Promise** */ function GET(token, data, parent, api) { return new Promise((resolve, reject) => { try { let req = new XMLHttpRequest() let endpoint = `${VERSION_URL}/${parent}/${api}` // base url with the params not included let params = new URLSearchParams() // URLSearchParams used for adding params to url // put data in GET request params for (const [key, value] of Object.entries(data)) { params.set(key, value) } let query_url = endpoint + "?" + params.toString() // final query url req.open("GET", query_url, true) req.setRequestHeader("token", token) // put token into header req.onloadend = () => { if (req.status === 200) { // success, return response resolve([req.response, req.status]) } else { reject([req.responseText, req.status]) } } req.onerror = () => { reject([req.responseText, req.status]) } req.send() } catch (err) { reject(["Exception", 0]) } }) }
希望能够得到该问题的排查方向与解决方案。
内容的提问来源于stack exchange,提问作者nreh
相关产品推荐
相关产品推荐

