错误 [ERR_STREAM_WRITE_AFTER_END]:结束后写入

Tad*_*dej 6 javascript fs node.js

代码说明:当用户访问特定 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)
    })
});
Run Code Online (Sandbox Code Playgroud)

在终端上,当我访问 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'
Run Code Online (Sandbox Code Playgroud)

当我过早关闭响应时,我认为存在问题。我应该如何将其更改为异步?

Laj*_*pad 14

您已经意识到问题所在。我们来看看这段代码:

    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)
Run Code Online (Sandbox Code Playgroud)

让我们假设那req.url是 ' /funkcionalnosti-streznika'。发生什么了?它进入第一个 if, writes html1and ends 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)
Run Code Online (Sandbox Code Playgroud)

  • @MarcusCastanho 请阅读 https://nodejs.org/api/stream.html#stream_writable_end_chunk_encoding_callback 基本上你就结束了写入可写。在上面的代码中,您可以删除所有 `res.end()` 行并将它们放在 if-else if-else 块之后,因为它在所有情况下都会被调用。`return` 为函数赋值并停止其执行。res.end 表示写作结束。如果有帮助的话,你可以做“return res.end();”。 (2认同)

小智 12

只需在每个 if 后面写入 return 即可,这将停止代码的进一步执行。

  • 经过多次尝试,这是拯救我的唯一答案。谢谢你,哈斯特。 (3认同)

小智 5

使用“if else”代替多个“if”条件,或者只返回每个“if”条件。

// ...
if (req.url == '/funkcionalnosti-streznika') {
  res.write(html1);
} else if (req.url == '/posebnosti') {
  res.write(html2);
} else {
  res.write('random');
}
res.end();
// ...
Run Code Online (Sandbox Code Playgroud)