一样的问题。 已解决
原因是:
淘宝镜像原地址2024年1月22日已过期
现已更换镜像地址为https://registry.npmmirror.com/
npm 和 yarn 的镜像地址不是一起的,需要各自设置各自的。
设置yarn
yarn config set registry https://registry.npmmirror.com/
解决。
关注引自免费微信小程序:皆我百晓生
看起来你在运行 Next.js 项目时遇到了一个错误,这个错误是由于证书已过期导致的。根据错误信息,Next.js 在尝试从某个位置获取版本信息时使用了 fetch 函数,但因为 SSL/TLS 证书已经过期,所以请求失败。
为了解决这个问题,你需要检查以下几个方面:
确保你的 Node.js 版本是最新的,旧版本的 Node.js 可能与某些证书不兼容。你可以通过运行以下命令更新到最新版(如果有可用的更新):
nvm install --latest-npm
如果你正在使用的是 Docker,确保你的 Docker 容器中的时间设置正确,并且没有时间同步问题。有时,容器内部的时间可能与主机不同步,导致证书验证失败。在启动 Docker 容器时添加 --tmpfs /etc/localtime:/etc/localtime:ro 参数可以临时解决此问题。
docker run --tmpfs /etc/localtime:/etc/localtime:ro your-image-name
清除缓存和重新安装依赖。这有时候可以解决一些与网络相关的暂时性问题。
npm cache clean --force
rm -rf node_modules
yarn install
检查是否有任何代理配置,特别是如果你在开发过程中使用了代理服务器。过期的证书可能会在代理服务器处产生问题。确保你的代理设置正确,并且使用的证书是有效的。
最后,如果以上方法都无法解决问题,可能是 Next.js 的热更新机制试图连接了一个不再提供服务或者证书已过期的服务器。在这种情况下,你可以在项目的根目录下创建一个名为 .env.local 的文件(如果还没有的话),然后添加以下行来禁用自动刷新:
DISABLE_HMR=1
这将阻止 Next.js 使用热模块替换功能,从而避免触发那个失败的 fetch 请求。
执行上述步骤后,再次运行你的 Next.js 项目:
yarn run dev
这样应该能解决因证书过期导致的错误。如果你的问题依然存在,可能需要进一步排查网络环境或者联系你的网络管理员确认是否有特定的网络限制或防火墙设置影响了 fetch 请求。
关注
关注
你遇到的错误与尝试在使用 Next.js 框架的 Node.js 应用程序中获取资源时出现的过期 SSL 证书有关。错误的关键部分是 certificate has expired 和 code: 'CERT_HAS_EXPIRED'。这通常发生在你尝试连接的服务器使用的 SSL 证书已过期时。
以下是解决此问题的几个步骤:
确保你的 Node.js 和项目依赖项是最新的。有时这些更新可以解决 SSL 问题。
npm update
如果这个问题阻碍了你的开发,并且你需要一个快速的临时修复,可以指示 Node.js 忽略 SSL 证书验证。这不建议用于生产环境,但对本地开发有帮助。
在脚本的开头添加这行代码(例如在 index.js 或等效的入口点):
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
检查你尝试连接的服务器的 SSL 证书。如果你控制服务器,应更新 SSL 证书。
undici 包由于错误发生在 undici 模块中,更新它可能解决问题。你可以运行以下命令:
npm install undici@latest
如果问题仍然存在,可以使用其他 HTTP 客户端库,如 axios 或 node-fetch,作为 undici 的替代品。
确保你的系统日期和时间设置正确。错误的日期和时间可能导致 SSL 证书验证失败。
如果你处理的是自定义 SSL 证书,确保它们在你的环境中正确配置。你可以如下向 Node.js 提供自定义证书:
const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('path/to/key.pem'),
cert: fs.readFileSync('path/to/cert.pem'),
ca: fs.readFileSync('path/to/ca.pem')
};
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
如果你在公司防火墙后面或使用代理,确保你的代理设置正确配置。
axios 的示例以下是如何用 axios 替换 undici 的示例:
const axios = require('axios');
axios.get('https://example.com')
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error('Error fetching data:', error);
});
通过遵循这些步骤,你应该能够解决 CERT_HAS_EXPIRED 错误并继续开发。