Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

/_next/image can give empty body with /pages/api served images #20110

Closed
2 tasks
700software opened this issue Dec 11, 2020 · 7 comments
Closed
2 tasks

/_next/image can give empty body with /pages/api served images #20110

700software opened this issue Dec 11, 2020 · 7 comments
Assignees
Labels
good first issue Easy to fix issues, good for newcomers Image (next/image) Related to Next.js Image Optimization. please verify canary The issue should be verified against next@canary. It will be closed after 30 days of inactivity
Milestone

Comments

@700software
Copy link

700software commented Dec 11, 2020

Bug report

Describe the bug

await server.getRequestHandler()(_req, mockRes, nodeUrl.parse(href, true))

  • Looks like we need to wait for mockRes._final to be called — not await promise completion.
  • (Also we need only implement mockRes._write, so we have no need to implement mockRes.write so we have no need to handle strings.)

To Reproduce

  1. Create an API endpoint /pages/api/images.js that returns an image using .pipe

    export const config = { api: { bodyParser: false } }
    
    export default async function (req, res) {
    
      var downloadStream = // from an external API (or in your case test with just a file stream)
    
      res.setHeader('Content-Type', 'image/jpeg')
      res.setHeader('Content-Length', ...)
      downloadStream.pipe(res)
    }
  2. Visit http://localhost:3000/_next/image?url=/api/image&w=3840&q=75
    (This is the endpoint normally generated by the new <Image> tags from next/image)

  3. You will have a blank page caused by empty response. (Ctrl+S saves a file to your desktop with zero length)

Expected behavior

The compressed/resized version of image

Workaround

  await new Promise(function (resolve) {
    // Need to use promise because of https://github.com/vercel/next.js/issues/20110
    // Otherwise we could have just used a `pipe` line and no promise.
    downloadStream.pipe(res)
    downloadStream.on('end', resolve)
  })

System information

  • OS: any, Browser: any
  • Version of Next.js: [e.g. 10.0.3]
  • Version of Node.js: [e.g. 14.3.0]
  • Deployment: next run dev

Why does this matter?

Why can we not just wait for promise completion?

A blank page is very much not useful to the developer. Having to go line-by-line and debug a webpacked node_modules is not the experience we need to give to the developer.

Normally, if the developer tried to send a response from his/her API endpoint with res.write and res.end they would have gotten

API resolved without sending a response for /api/uploads/image, this may result in stalled requests.

which would totally make having a blank response no big deal because the clear problem statement is in the logs.

However, this log clue does not appear for pipe calls. So the developer, without us doing something on this issue, has no clear recourse.

@700software 700software added the bug Issue was opened via the bug report template. label Dec 11, 2020
@timneutkens timneutkens added good first issue Easy to fix issues, good for newcomers kind: bug and removed bug Issue was opened via the bug report template. labels Dec 14, 2020
@timneutkens timneutkens added this to the backlog milestone Dec 14, 2020
@baptisteArno
Copy link

Hi @700software,

I have the same problem but with a different use case:

res.status(307)
console.log(signedUrl)
res.setHeader('Location', signedUrl)
res.end()

It logs a valid URL. But it says API resolved without sending a response and it doesn't have the location header. I don't understand why. Any idea?

@700software
Copy link
Author

700software commented Dec 26, 2020

@baptisteArno, For your case use res.statusCode=.

.status() is calling .end() internally methinks. Probably from Express. It's not part of Node.js core.

Probably the reason for your issue is Express (or whatever framework .status() is from) is attached to res before Next.js adds it's override of .end(). This is normal.

@alexjpujol
Copy link

I've tried using res.statusCode = as well as res.status(...) and still get the API resolved without sending a response...

wondering if there's any insight or update here.

@700software
Copy link
Author

Can you find my email address on my profile and send code of full file?

@timneutkens timneutkens added the Image (next/image) Related to Next.js Image Optimization. label Nov 17, 2021
@jankaifer jankaifer self-assigned this Dec 1, 2022
@jankaifer jankaifer added the please verify canary The issue should be verified against next@canary. It will be closed after 30 days of inactivity label Dec 1, 2022
@github-actions
Copy link
Contributor

github-actions bot commented Dec 1, 2022

Please verify that your issue can be recreated with next@canary.

Why was this issue marked with the please verify canary label?

We noticed the provided reproduction was using an older version of Next.js, instead of canary.

The canary version of Next.js ships daily and includes all features and fixes that have not been released to the stable version yet. You can think of canary as a public beta. Some issues may already be fixed in the canary version, so please verify that your issue reproduces by running npm install next@canary and test it in your project, using your reproduction steps.

If the issue does not reproduce with the canary version, then it has already been fixed and this issue can be closed.

How can I quickly verify if my issue has been fixed in canary?

The safest way is to install next@canary in your project and test it, but you can also search through closed Next.js issues for duplicates or check the Next.js releases.

My issue has been open for a long time, why do I need to verify canary now?

Next.js does not backport bug fixes to older versions of Next.js. Instead, we are trying to introduce only a minimal amount of breaking changes between major releases.

What happens if I don't verify against the canary version of Next.js?

An issue with the please verify canary that receives no meaningful activity (e.g. new comments that acknowledge verification against canary) will be automatically closed and locked after 30 days.

If your issue has not been resolved in that time and it has been closed/locked, please open a new issue, with the required reproduction, using next@canary.

I did not open this issue, but it is relevant to me, what can I do to help?

Anyone experiencing the same issue is welcome to provide a minimal reproduction following the above steps. Furthermore, you can upvote the issue using the 👍 reaction on the topmost comment (please do not comment "I have the same issue" without repro steps). Then, we can sort issues by votes to prioritize.

I think my reproduction is good enough, why aren't you looking into it quicker?

We look into every Next.js issue and constantly monitor open issues for new comments.

However, sometimes we might miss one or two due to the popularity/high traffic of the repository. We apologize, and kindly ask you to refrain from tagging core maintainers, as that will usually not result in increased priority.

Upvoting issues to show your interest will help us prioritize and address them as quickly as possible. That said, every issue is important to us, and if an issue gets closed by accident, we encourage you to open a new one linking to the old issue and we will look into it.

Useful Resources

@balazsorban44
Copy link
Member

This issue has been automatically closed because it wasn't verified against next@canary. If you think it was closed by accident, please leave a comment. If you are running into a similar issue, please open a new issue with a reproduction. Thank you.

@github-actions
Copy link
Contributor

github-actions bot commented Feb 3, 2023

This closed issue has been automatically locked because it had no new activity for a month. If you are running into a similar issue, please create a new issue with the steps to reproduce. Thank you.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Feb 3, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
good first issue Easy to fix issues, good for newcomers Image (next/image) Related to Next.js Image Optimization. please verify canary The issue should be verified against next@canary. It will be closed after 30 days of inactivity
Projects
None yet
Development

No branches or pull requests

6 participants