Nextjs 在生产服务器上部署后不使用图像 url 获取图像

2023-12-19

对于生产部署,我们有一个由 3 台 Linux 机器组成的网络。其中两个用于部署,一个是 nginx 代理。 对于开发部署,我们有一台单独的 Linux 机器。

在前端(这是一个 nextjs 框架)内部,设置了一个 http-proxy-middleware 用于解析浏览器的 cors 请求。 这是http-proxy-middleware的代码:

import { API_URL } from "../../../config/";
import { createProxyMiddleware } from "http-proxy-middleware";

// Create proxy instance outside of request handler function to avoid unnecessary re-creation
const apiProxy = createProxyMiddleware({
  target: `${API_URL}`,
  changeOrigin: true,
  pathRewrite: { [`^/api/proxy`]: "" },
  secure: false,
});

export default function handler(req, res) {
  console.log(
    `Method: ${req.method} URL: ${req.url} Status Code: ${res.statusCode}`
  );
  apiProxy(req, res, (result) => {
    if (result instanceof Error) {
      throw result;
    }

    throw new Error(
      `Request '${req.url}' is not proxied! We should never reach here!`
    );
  });
}
export const config = { api: { externalResolver: true, bodyParser: false } };

为了获取图像,我们只需在 next/image 组件的 src 属性中提供图像 url。像这样:

<Image
      src={currentImage.imageurl}
      alt={currentImage.imageurl} 
      layout="fill"
      className={styles.imageSize}  />

这是 next.config.js 文件:

module.exports = {
  reactStrictMode: true,
  images: {
    domains: ["exam105.s3.amazonaws.com"],
  },
  async headers() {
    return [
      {
        source: "/(.*)",
        headers,
      },
    ];
  },
};

正如您在上面的 next.config.js 文件中看到的,我也添加了图像的域。我还取消了 dockerfile 中这一行的注释,以上传 next.config.js 文件中的更改:COPY --from=builder /app/next.config.js ./这就是为什么当前端部署在开发服务器上时,将获取图像并在浏览器上显示。但是,当前端部署在生产环境中时,不会显示图像,而是会弹出错误: 在浏览器上,它给出500 Internal Server Error。 这是 nginx 日志中出现的错误:

"GET /_next/image?url=https%3A%2F%2Fexam105.s3.amazonaws.com%2Fimage.jpg&w=128&q=75 HTTP/1.1" 500 32 "https://exam105.com/search/6176cdfe27612732e98a25d9/6176cdfe27612732e98a25d6" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62"

前端日志打印此错误:

FetchError: request to https://exam105.s3.amazonaws.com/image.JPG failed, reason: getaddrinfo EAI_AGAIN exam105.s3.amazonaws.com
     at ClientRequest.<anonymous> (/app/node_modules/node-fetch/lib/index.js:1461:11)
     at ClientRequest.emit (node:events:390:28)
     at TLSSocket.socketErrorListener (node:_http_client:447:9)
     at TLSSocket.emit (node:events:390:28)
     at emitErrorNT (node:internal/streams/destroy:157:8)
     at emitErrorCloseNT (node:internal/streams/destroy:122:3)
     at processTicksAndRejections (node:internal/process/task_queues:83:21) {
   type: 'system',
   errno: 'EAI_AGAIN',
   code: 'EAI_AGAIN'
 }

正如我们从 nginx 日志中的错误中看到的,图像 URL 是用某些字符进行编码的,在我看来这可能就是问题所在。当我通过单击浏览器中损坏的图像进入检查元素时,该网址也可见。前端正在发送编码的 url,但未解码,因此抛出错误。我们如何删除下一个/图像组件的编码?或者,如果无法阻止编码,我们如何在架构的上下文中对其进行解码?因为我尝试更换<Image.../> with <img.../>标签和图像也开始显示在生产环境中部署的前端上。这次当我在浏览器中检查图像时,没有在 URL 中看到任何编码。因此 next/image 组件正在执行编码,但在部署到生产服务器上时它不会被解码,但是当它部署在开发服务器上时,它会被解码并且也可以使用 next/image 组件看到图像。

我希望你能理解这个问题。 如果有不清楚的地方,请发表评论。谢谢。


看起来 next 的加载器正在对 url 进行编码,为了克服这个问题,您可以定义自己的加载器,它只是返回 src,如下所示:

  const loaderProp =({ src }) => {
    return src;
  }

然后在你的中引用它<Image> as:

<Image
      src={currentImage.imageurl}
      alt={currentImage.imageurl} 
      layout="fill"
      className={styles.imageSize} 
      loader={loaderProp} />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nextjs 在生产服务器上部署后不使用图像 url 获取图像 的相关文章

  • API 使用令牌向 odoo 进行身份验证

    我想使用令牌从 Express 应用程序向 Odoo 进行身份验证 我在用odoo xmlrpc https www npmjs com package odoo xmlrpc连接 Odoo 的节点模块 我的快递应用程序 Odoo 要求 A
  • Node.js 升级在 Windows 中仍然显示旧版本

    我已使用 msi 安装程序下载并安装了新版本的 nodejs 4 1 2 之后我跑了node v 但它仍然显示旧版本 0 12 2 我尝试重新启动Windows 甚至卸载nodejs并重新安装它 但仍然显示相同的内容 为什么会发生这种情况
  • Meteor.setTimeout 和 Meteor.methods 之间的并发

    在我的 Meteor 应用程序中实现回合制多人游戏服务器 客户端通过发布 订阅接收游戏状态 并且可以调用 Meteor 方法sendTurn将回合数据发送到服务器 他们无法直接更新游戏状态集合 var endRound function g
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 监听文件夹和文件(更改)

    可以直接在 PHP 或 Node 上监听文件夹和文件的更改 通过事件 还是我需要创建自己的方法来执行此操作 Example 我需要听文件夹 user 如果我将一些文件添加到该目录中 PHP 或 Node 会收到信息并运行PathEvent
  • 如何为我的整个 Node.js 应用程序使用相同的 MySQL 连接?

    我有一个app js 我从那里运行我的整个应用程序 在 app js 内部 我require许多文件中都有代码 对于每个文件 我都这样做 var mysql require mysql var mclient mysql createCon
  • 对于实时网站使用 Node.js 或 Ringojs 安全吗?

    正如标题中所述 我想知道使用实际的 omg 平台 即 Node js 和 Ringo js 的实际版本 之一来开发网站是否安全 另外 我想知道他们是否支持cookie sessions以及他们如何处理多字段帖子 PHP中的fieldname
  • HTML 格式的 Google Apps 脚本

    是否可以在我的 HTML 中使用 google apps 脚本 我希望能够从外部框架 例如 Node js 以纯 Javascript 形式从表单写入电子表格 https developers google com apps script
  • 在 Node 中使用 Babel 导入与请求 [重复]

    这个问题在这里已经有答案了 我想在一个文件中导入一个类 use strict import models from model class Foo bar export default new Foo 当我使用导入时它有效 例如 impor
  • 使用base64编码图像的优点和缺点[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在考虑为我正在开发的网站使用 Base64 编码图像来优化加载时间 不管怎样 在开始之前 我想知道 这样做的优点和缺点是什么 目前 我没有看
  • libxmljs 的替代品 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 目标 使用 Node js 访问网页 使用 xpath 语法操作 DOM 并打印新的 DOM libxm
  • 缺少节点-v59-linux-x64/grpc_node.node

    我正在尝试在我的服务器中使用 Firebase admin SDK 当我部署时 出现错误 我在 firebase admin node module 映射中缺少文件 node v59 linux x64 grpc node node 我在包
  • Node.js 重写 toString

    我试图覆盖我的对象的默认 toString 方法 这是代码和问题 function test this code 0 later on I will set these this name test prototype toString f
  • Sequelize - 使用 es6 和模块运行迁移

    我不确定我是否做错了什么或者什么 我觉得我正在运行一个现代的 相当常见的堆栈 但我无法让新的 Sequelize v6 与我的设置完美配合 我在 Node v14 17 Sequelize v6 6 2 上 在我的 package json
  • NestJS e2e 测试模拟会话装饰器

    我正在尝试使用 supertest 编写一个 e2e 测试 其中我的控制器实际上使用了 Session 装饰师 然而 我不想承担使用数据库连接等启动会话的全部负担 因此测试中的我的应用程序实际上并未初始化会话 相反 我想首先模拟掉装饰器提供
  • Angular-cli AOT 构建失败,并显示“致命错误:CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足”

    我正在尝试使用 AOT 构建我的 angular cli 项目 ng build aot 但它因错误而失败 致命错误 CALL AND RETRY LAST 分配失败 JavaScript 堆内存不足 如果我用 prod flag 任何想法
  • 如何使用Create React App安装React

    嗨 我对反应真的很陌生 我不知道如何实际安装它 也不知道我需要做什么才能在其中编写代码 我下载了node js并且安装了v12 18 3以及NPM 6 14 6 但是每次我尝试在许多网站上提到的create react app安装方法中输入
  • 下载中带有文件名的 NodeJS sendFile

    我尝试使用以下代码将文件发送给客户端 router get get myfile function req res next res sendFile other file name dat 它工作正常 但当用户从以下网址下载此文件时我需要
  • 如何向 boto 中的联合用户授予 s3 存储桶的权限?

    尝试从文档中找出答案 但无法创建可以访问 s3 存储桶的联合用户 首先是进口 gt gt gt from boto s3 connection import S3Connection gt gt gt from boto sts impor
  • Nodejs Express中间件函数返回值

    我正在使用 NodeJS 和 Express 我有以下路线 中间件功能是Mobile 如果我不使用 return next 在 isMobile 函数中 应用程序会卡住 因为 NodeJS 不会移至下一个函数 但我需要 isMobile 函

随机推荐

  • Codeigniter 中国家/地区和城市的 Ajax 下拉菜单?

    我正在我们的 Codeigniter 框架中借助 ajax 使国家和城市下降 数据库的结构如下所示 Country country id country name State country id state id state name c
  • 如何在 Chrome 扩展中使用 google 创建登录信息

    我最近刚刚构建了一个插件 需要在其中集成 Google Login 我搜索并发现chrome identity使用谷歌帐户对用户进行身份验证 但这效果不佳 所以我通过使用下面的代码找到了一个解决方案 var manifest chrome
  • 使用 VBA 宏删除 PowerPoint 中的图片

    我正在使用以下 VBA 宏删除 PowerPoint 幻灯片中的所有图片 Public Function delete slide object slide no Reference existing instance of PowerPo
  • Zend Action 助手与插件

    我有一个出现在每个页面上的侧边栏 侧边栏的第一个元素是 a 登录表单 或 b 当前用户的详细信息 取决于用户是否登录 我已经阅读了一些实现此目的的方法 并计划在引导程序中初始化侧边栏占位符 当需要将用户详细信息或登录表单附加到侧边栏时 我应
  • Allegro CL 在调用(读取)函数时冻结

    每当我打电话给 read 在 Allegro Common Lisp 9 0 中 调试窗口 中断 抱歉 我想不出更清晰的术语 鼠标变成旋转的蓝色死亡轮 窗口拒绝评估任何新输入 尽管它可以仍然可以输入 IDE 的其他部分不受影响 屏幕看起来像
  • 关于加快选边速度的建议

    我正在用 C 构建一个图形编辑器 用户可以在其中放置节点 然后将它们与有向或无向边连接 完成后 A 寻路算法确定两个节点之间的最佳路径 我拥有的 具有 x y 连接节点列表以及 F G 和 H 分数的 Node 类 具有 Start Fin
  • 标准库方法的成员函数指针问题

    这个问题源于 将指向重载类方法的成员函数指针传递到模板函数中 https stackoverflow com questions 31309846 passing a member function pointer to an overlo
  • 丰富的卡片属性 Markdown 格式

    我在英雄卡中的文本属性的降价格式方面遇到问题 这是代码示例 HeroCard heroCard new HeroCard Text Place1 Berlin n n Place2 Hamburg Buttons cardButtons 它
  • 使用 Google Earth Engine 计算每个地区、月份和年份的 NDVI?

    我想计算每个区域 管理级别 3 也称为 Wearda 月份和年份的平均 NDVI 所以我的最终结果看起来像这样 regions year month NDVI region 1 2010 1 0 5 region 1 2010 2 0 6
  • 如果没有空间,操作栏会将选项卡转换为列表导航

    I have an actionbar with a logo a title 2 tabs and a search function On a phone 3 5 everything works fine The actionbar
  • Git:跟踪还是取消跟踪 Android API 密钥?

    我正在使用适用于 Android 的 Google 地图 API 当我想在旅行时处理代码时 我将代码从桌面推送到 Github 然后从 Github 下载到我的笔记本电脑上 就 Google Maps API 而言 我需要将 API 密钥放
  • Xcode 6 iOS 8 UITableView rowHeight 属性返回 -1 [重复]

    这个问题在这里已经有答案了 我有一个UITableView在我的项目中的 Xcode 中 我设置了rowHeight to be 44 in StoryBoard 在 iOS7 中一切正常 但在 iOS8 rowHeight 返回值 1这导
  • Java:showInputDialog 中的自定义按钮

    如何将自定义文本添加到 JOptionPane showInputDialog 的按钮 我知道这个问题带有自定义按钮的 JOptionPane showInputDialog https stackoverflow com question
  • 在滚动时有效调整 UITableViewCell 的大小

    大概的概念 我希望在用户滚动列表时动态调整 UITableViewCells 的大小 也就是说 使项目在到达列表底部时尺寸增大 注意事项 这是一个每秒需要刷新多次的进程 因为调用如下 void scrollViewDidScroll UIS
  • caret:结合分层的 createMultiFolds (repeatedCV) 和 groupKFold

    我的问题与中提出的问题非常相似插入符号 结合 createResample 和 groupKFold https stackoverflow com questions 48142617 caret combine createresamp
  • 在 pandas 数据框中的两列之间传输值

    我有一个像这样的熊猫数据框 p q 0 5 0 5 0 6 0 4 0 3 0 7 0 4 0 6 0 9 0 1 所以 我想知道 如何将较大的值传输到 p 列 反之亦然的 q 列 将较小的值传输到 q 列 如下所示 p q 0 5 0 5
  • Lua中的线程优先级

    我看了Lua的书 了解到Lua中的多线程是协作的 我找不到的是有关线程优先级的一些信息 我猜想具有相同优先级的线程会运行直到完成 因为多线程是协作的 或者完成了收益 如果一个线程的优先级高于另一个线程呢 它是否能够中断优先级较低的线程 或者
  • 允许的内存大小 268435456 字节已耗尽[重复]

    这个问题在这里已经有答案了 可能的重复 允许的 X 字节内存大小已耗尽 https stackoverflow com questions 4096582 allowed memory size of x bytes exhausted 我
  • 反序列化 ArrayList。没有有效的构造函数

    这就是我反序列化包含标识对象的 arrayList 的方式 public void deserializeArrayList String path qbank IdentificationHARD quiz try FileInputSt
  • Nextjs 在生产服务器上部署后不使用图像 url 获取图像

    对于生产部署 我们有一个由 3 台 Linux 机器组成的网络 其中两个用于部署 一个是 nginx 代理 对于开发部署 我们有一台单独的 Linux 机器 在前端 这是一个 nextjs 框架 内部 设置了一个 http proxy mi