节点.JS主循环将不会返回



我正在尝试使用Node设置模板站点。JS。我是使用Node的新手。JS和我试图打开一个HTML文件和一个CSS文件,然后再继续编写其余的代码。然而,即使到达reponse.end((,循环也会继续运行,事实上,它会进行第二次,但不会再次到达终点。为了演示这一点,我加入了一些console.log((。我将在下面抛出我的JS代码和模式控制台输出。我不知道如何解决这个问题,如果有任何帮助,我将不胜感激。非常感谢大家!

const server = require('http').createServer()
const markdown = require( "markdown" ).markdown
const fs = require('fs')
server.on('request', (request, response) => {
response.setHeader('Content-Type', 'text/html')
var page = fs.readFileSync("html/tb.html", 'utf8')
console.log("reading html...")
page+= "<style>"+fs.readFileSync("css/style.css", 'utf8')+"</style>"
console.log("reading css...")
const lang = Intl.DateTimeFormat().resolvedOptions().locale

if (request.url === '/') {
response.end()
}
else if (request.url === '/coucou') {
page+=markdown.toHTML('#Hello world!')
response.end(page)
console.log("end")
}
})
server.listen(4000)

我很抱歉我缺乏NodeJS的经验,但我似乎在其他地方找不到这个问题的答案。这是我加载"coucoucou"时的控制台输出:

reading html...
reading css...
end
reading html...
reading css...

在主页上

reading html...
reading css...
reading html...
reading css...

它在第二轮之后不会继续,但浏览器从未接收到结束信号,因此会无限期地继续加载。我如何让它真正处理响应的末尾,并告诉我的浏览器停止加载?

再次感谢大家!!!

我尝试将if-else块中的response.end((s更改为response.write((,并在条件块后面放一个response.end

if (request.url === '/') {
response.write(page)
}
else if (request.url === '/coucou') {
page+=markdown.toHTML('#Hello world!')
response.write(page)
console.log("end")
}
response.end()

这似乎奏效了!!无论如何,非常感谢大家!

将以下内容添加到脚本中:

if (request.url === '/') {
response.end()
} else if (request.url === '/coucou') {
page+=markdown.toHTML('#Hello world!')
response.end(page)
console.log("end")
} else {
console.log("No response for "+request.url);
}

日志输出应该解释发生了什么:在第三种情况下,您从未结束响应。

在浏览器的devtools的网络面板中查看也会显示哪个请求仍然挂起而没有完全响应。

默认情况下,它很可能是浏览器请求的收藏夹。页面内容将被加载,但状态栏仍将显示";加载";。正如@jfriend所建议的,使用response.status(404).end();else块中

最新更新