【问题标题】:Node.JS main loop will not returnNode.JS 主循环不会返回
【发布时间】:2022-01-26 16:12:26
【问题描述】:

我正在尝试使用 Node.JS 设置模板站点。我是使用 Node.JS 的新手,我正在尝试打开一个 HTML 文件和一个 CSS 文件,然后再继续阅读其余代码。但是,即使到达 reponse.end(),循环也会继续运行,实际上是第二次运行,但不会再次到达终点。我投入了一些 console.log()s 来证明这一点。我将把我的 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 经验,但我似乎无法在其他任何地方找到这个问题的答案。这是加载“coucou”时的控制台输出:

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

这里是首页

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

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

再次感谢大家!!!

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    我尝试将 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()
    

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

    【讨论】:

    • 当请求的 URL 不匹配任何内容时,您可能不想要 200 状态。当 URL 不匹配时,我建议返回 404 状态。
    • 我还没有写完应用程序。我也不打算有一个静态的“coucou”页面。我的最终目标是让它搜索几个可能的静态页面,然后查找不在静态列表中的任何其他内容。最后,如果它无法以这种方式找到页面,它将返回 404。感谢您的输入。
    • 仅供参考,非常简单的Express framework 使得“路由”和“中间件”的定义比if/elseswitch 声明要简单得多。它还为您做了很多其他有用的事情,例如解析 cookie 和查询字符串。出于教育目的,您可以自己编写所有内容,但如果您真的只是想提高构建网站的效率,您会发现 Express 迷你框架非常有用,可以为您节省大量时间。它甚至可以处理文件系统中静态资源的自动查找和缓存。
    【解决方案2】:

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

    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);
    }
    

    日志输出应该解释正在发生的事情:还有第三种情况,您从未结束响应。

    查看your browser's devtools 的网络面板也会显示哪个请求仍在挂起而没有完整的响应。

    这很可能是浏览器默认请求的图标。页面内容将已加载,但状态栏仍将显示“正在加载”。正如@jfriend 建议的那样,使用 response.status(404).end();else 块中

    【讨论】:

    • else 分支中不需要response.end() 吗?而且,也许设置一个 404 状态?
    • @jfriend00 是的,日志是为了教育,代码并不是解决问题的解决方案
    • 将 response.end() 放在分支之外似乎已经修复了它。我还没有开始实施网站的其余部分,这就是为什么还没有 404 响应的原因。感谢您向前看,但这并不是真正需要的,也与所提出的问题无关......
    • @user17678146 对于尚未实现的页面,您应该始终默认为 404 错误。您仍然可以稍后通过回复 200 来添加页面,并为您之前回复 404 的内容添加内容,但不需要更改默认设置。
    猜你喜欢
    • 2021-02-01
    • 2018-12-03
    • 2011-07-14
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    相关资源
    最近更新 更多