自定义node.js Web服务器未完成加载CSS和JavaScript

达蒙·卡斯韦尔(Damon Kaswell)

为了自我保护,我正在尝试编写一个纯node.js Web服务器。这样做的目的是完全避免使用预先编写的中间件或任何非默认的node.js模块来加载静态HTML,CSS和JavaScript,并强迫自己学习纯正的node.js方法的来龙去脉。 。

我已经启动并运行它,并对其进行了几次测试,在我决定通过几次在静态页面上快速点击刷新来对它进行压力测试之前,它似乎工作得很好。

前3-4次装弹效果很好。之后,静态HTML文件调用的CSS或JavaScript文件均不会加载。

这是我的文件读取代码:

fs.readFile(filename, function(err, contents) {
    if(err) {
        throw err;
    } else {
    res.setHeader("Content-Length", contents.length);
        res.setHeader("Content-Type", validExtensions[ext]);
        res.statusCode = 200;
        res.write(contents);
        res.end();
    }
});

validExtensions只是成对的扩展名及其相应的mime类型的数组。)

当存在HTML文件,CSS文件和JavaScript文件时,在页面加载期间将调用此函数3次。同样,它可以正常工作,直到突然不起作用为止。然后,如果我再刷新一次,一切就恢复了。

我怀疑这是怎么回事,有时它会在CSS或JavaScript文件完成之前完成HTML文件。

我能想到的唯一解决方法是非常讨厌的。我可以创建一个单独的函数来处理不是HTML的所有文件,并使该过程保留剩余文件的数量。然后,我可以while在处理HTML的函数中使用一个循环,并阻止该循环执行res.end()直到该计数为零为止,但这听起来既丑陋又可能消耗资源。

或者,我可以使用同步加载所有非HTML文件的(甚至更糟的)解决方法,但是由于该调用将来自本来是异步处理的函数中,所以我真的不想这样做。

如果我只是尝试构建一个静态站点,则可以使用http-server或express或许多出色的解决方案之一来提供静态文件,但是它们都具有广泛的模块依赖性,我正在尝试获得该解决方案。没有他们就完成了。

有没有一种优雅而纯粹的方法来确保res.end()在所有非HTML文件完成其工作之前不会加载HTML?

编辑:所以任何人都可以看到整个上下文,整个项目,它的内容,位于github上的https://github.com/GoodDamon/customserver

缺口

您的问题在于customServer.url如果要打开浏览器的开发工具并检查的内容app.css,您会发现它有时仅填充以下行:

console.log("CustomServer successfully loaded!");

...恰好与app.js文件的内容相同巧合?没有。如果您查看节点控制台的输出,您会不时看到以下内容:

10/11/2015 5:42:09 PM: New client request: /css/app.css - Method: GET 
10/11/2015 5:42:09 PM: Client requested a file. Testing extension validity... 
10/11/2015 5:42:09 PM: File extension .css is VALID. Testing availability... 
10/11/2015 5:42:09 PM: New client request: /js/app.js - Method: GET 
10/11/2015 5:42:09 PM: Client requested a file. Testing extension validity... 
10/11/2015 5:42:09 PM: File extension .js is VALID. Testing availability... 
10/11/2015 5:42:09 PM: File is AVAILABLE. Providing to client. 
10/11/2015 5:42:09 PM: File is AVAILABLE. Providing to client.

如您所见,浏览器首先请求app.css,紧接着是app.js因为“向客户端提供”两行都在底部,所以您知道节点服务器尚未完成对第一个请求的处理。客户端最终接收到的是app.js两次,分别以.css和.js文件发送。

为什么是这样?从理论上讲,每个命中节点服务器的客户端请求都应隔离到其自己的事件循环中。不应有交叉污染。问题在于customServer.url,这是您将传入req.url分配给的内容因为它不在两个客户端请求的范围之内,所以每个请求都会覆盖前一个的值。

对于同步编程而言,这不是问题,但是node.js完全是异步的,并且将尽快执行所有请求,无论是否还有待处理的请求。您的fs.stat()呼叫需要花费一些时间才能执行,并且很有可能在成功/错误回调执行之前,另一个请求已到达服务器。

tl; dr:此行-customServer.getFile(customServer.url, res, ext);将同一文件发送到2个不同的请求,因为您正在customServer.url用每个新请求覆盖在请求范围内跟踪您的请求URL!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 node js 创建简单的服务器(自定义协议)

来自分类Dev

使用 winston.js 和 node.js 自定义消息格式

来自分类Dev

在node.js Web应用程序中引用自定义javascript文件

来自分类Dev

在Azure Bitnami服务器上设置Node.js以使用自定义域名

来自分类Dev

适用于 Node.js 的 PhoneGap Build API - 无法加载自定义构建

来自分类Dev

我如何在adonis /node.js中创建自定义验证器?

来自分类Dev

如何为node.js markdownpdf设置自定义css路径?

来自分类Dev

Travis使用Node.js和自定义ftp构建

来自分类Dev

Node.js和npm:如何创建自定义npm cli命令?

来自分类Dev

内置事件和自定义事件的node.js事件循环行为差异

来自分类Dev

Node.js 和 express Rest api 来创建自定义字段路由

来自分类Dev

加载自定义wordpress插件的js和css文件

来自分类Dev

自定义 Systemd 服务未完成激活

来自分类Dev

jQuery没有向node.js服务器发送自定义标头CORS请求,或者服务器未收到?

来自分类Dev

Meteor.js和自定义OpenId Connect服务器

来自分类Dev

Node.js数据表编辑器-多列的自定义/唯一验证

来自分类Dev

关于自定义node.js CLI工具配置文件的建议/最佳实践:位置和命名?

来自分类Dev

如何使用javascript(node.js)从utc时间戳获取自定义时区日期时间

来自分类Dev

CSS 和 JS 未加载到 Node.js 服务器上

来自分类Dev

自定义目录以包含JS和CSS文件

来自分类Dev

Facebook使用JS SDK打开图自定义故事和自定义对象

来自分类Dev

node.js http-proxy自定义路由

来自分类Dev

Openshift上的自定义node.js版本

来自分类Dev

自定义函数成功响应/ node.js

来自分类Dev

从硬盘安装自定义Node.js模块

来自分类Dev

node.js http-proxy自定义路由

来自分类Dev

使用Node.js做自定义头像

来自分类Dev

根据后端模块设置加载自定义JS文件

来自分类Dev

简单的Node.js Web服务器始终发送文本/纯CSS和JS文件

Related 相关文章

  1. 1

    使用 node js 创建简单的服务器(自定义协议)

  2. 2

    使用 winston.js 和 node.js 自定义消息格式

  3. 3

    在node.js Web应用程序中引用自定义javascript文件

  4. 4

    在Azure Bitnami服务器上设置Node.js以使用自定义域名

  5. 5

    适用于 Node.js 的 PhoneGap Build API - 无法加载自定义构建

  6. 6

    我如何在adonis /node.js中创建自定义验证器?

  7. 7

    如何为node.js markdownpdf设置自定义css路径?

  8. 8

    Travis使用Node.js和自定义ftp构建

  9. 9

    Node.js和npm:如何创建自定义npm cli命令?

  10. 10

    内置事件和自定义事件的node.js事件循环行为差异

  11. 11

    Node.js 和 express Rest api 来创建自定义字段路由

  12. 12

    加载自定义wordpress插件的js和css文件

  13. 13

    自定义 Systemd 服务未完成激活

  14. 14

    jQuery没有向node.js服务器发送自定义标头CORS请求,或者服务器未收到?

  15. 15

    Meteor.js和自定义OpenId Connect服务器

  16. 16

    Node.js数据表编辑器-多列的自定义/唯一验证

  17. 17

    关于自定义node.js CLI工具配置文件的建议/最佳实践:位置和命名?

  18. 18

    如何使用javascript(node.js)从utc时间戳获取自定义时区日期时间

  19. 19

    CSS 和 JS 未加载到 Node.js 服务器上

  20. 20

    自定义目录以包含JS和CSS文件

  21. 21

    Facebook使用JS SDK打开图自定义故事和自定义对象

  22. 22

    node.js http-proxy自定义路由

  23. 23

    Openshift上的自定义node.js版本

  24. 24

    自定义函数成功响应/ node.js

  25. 25

    从硬盘安装自定义Node.js模块

  26. 26

    node.js http-proxy自定义路由

  27. 27

    使用Node.js做自定义头像

  28. 28

    根据后端模块设置加载自定义JS文件

  29. 29

    简单的Node.js Web服务器始终发送文本/纯CSS和JS文件

热门标签

归档