NodeJS 错误[结束后写入流错误]:结束后写入

nnsrf1az  于 2022-12-03  发布在  Node.js
关注(0)|答案(4)|浏览(203)

代码说明:当用户访问特定的URL时,我返回特定的HTML文件:

const http = require('http');
const fs = require('fs');

fs.readFile('./funkcionalnosti-streznika.html', function(err1, html1) {
    fs.readFile('./posebnosti.html', function(err2, html2) {
        if (err1 || err2) {
            throw new Error();
        }

        http.createServer(function(req, res) {
            if (req.url == '/funkcionalnosti-streznika') {
                res.write(html1);
                res.end();
            }
            if (req.url == '/posebnosti') {
                res.write(html2)
                res.end();
            } else {
                res.write('random');
                res.end();
            }
        }).listen(8080)
    })
});

在终端我已经得到了这个错误当我访问localhost:8080/funkcionalnosti-streznika:

events.js:288
      throw er; // Unhandled 'error' event
      ^

Error [ERR_STREAM_WRITE_AFTER_END]: write after end
    at write_ (_http_outgoing.js:637:17)
    at ServerResponse.write (_http_outgoing.js:629:15)
    at Server.<anonymous> (/*filelocation*/:19:21)
    at Server.emit (events.js:311:20)
    at parserOnIncoming (_http_server.js:784:12)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:119:17)
Emitted 'error' event on ServerResponse instance at:
    at writeAfterEndNT (_http_outgoing.js:692:7)
    at processTicksAndRejections (internal/process/task_queues.js:85:21) {
  code: 'ERR_STREAM_WRITE_AFTER_END'

我想当我过早地关闭响应时会有问题。我应该如何将其更改为异步?

bttbmeg0

bttbmeg01#

你已经意识到问题所在了。让我们看一下这段代码:

http.createServer(function(req, res) {
        if (req.url == '/funkcionalnosti-streznika') {
            res.write(html1);
            res.end();
        }
        if (req.url == '/posebnosti') {
            res.write(html2)
            res.end();
        } else {
            res.write('random');
            res.end();
        }
    }).listen(8080)

假设req.url是' /funkcionalnosti-streznika',会发生什么?它进入第一个if,写html1,结束res。然后检查'/posebnosti',但它是不同的,因为第一个if是真的。这意味着else分支将被执行,所以res.write('random');被调用,但是res已经在第一个if中关闭。建议:

http.createServer(function(req, res) {
    if (req.url == '/funkcionalnosti-streznika') {
        res.write(html1);
        res.end();
    }
    else if (req.url == '/posebnosti') {
        res.write(html2)
        res.end();
    } else {
        res.write('random');
        res.end();
    }
}).listen(8080)
nkcskrwz

nkcskrwz2#

只要在每个if之后写return,这将停止代码的进一步执行。

ut6juiuv

ut6juiuv3#

您可以在API内部使用if (res.writableEnded) return;检查您的中间件是否已经写入响应流(它曾经是response.finished,但现在已过时)

xoefb8l8

xoefb8l84#

不要使用多个“if”条件,而要使用“if else”或只返回每个“if”条件。

相关问题