我有一个使用socket.io和express的简单node.js应用程序。目前所有的javascript都在HTML文件中,但我想尝试将其分离为.js文件。
在我的主节点应用程序中,我有以下内容:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
直到我将javascript从index.html移到.js文件,然后尝试从我的HTML文件中引用它,如下所示:
<script src="functions.js"></script>
我认为express无法提供静态文件,因此我尝试了以下方法:
app.get('/', function (req, res) {
res.sendFile(__dirname + '/functions.js');
});
谁能告诉我我在做什么错?
默认情况下,nodejs和express不提供任何文件。因此,当您创建第一个路线时:
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
这成功地允许浏览器请求/
查看您的index.html文件。然后,浏览器将接收该HTML文件并进行解析。如果<script>
在该文件中找到标签,它将向您的服务器发出新的Web请求。因此,如果该文件包含以下内容:
<script src="functions.js"></script>
然后,浏览器将询问您的服务器/functions.js
。由于您没有该请求的路由,因此服务器将返回404错误,并且浏览器将无法获取脚本文件。
因此,您必须制作一条能够/functions.js
在浏览器要求时正确使用的路由,同时仍然保留用于index.html文件的现有路由。
您可以/functions.js
像为一样为自己建立一条特定的路线/
。或者,对于静态文件,您可以express.static()
用来创建可以服务许多静态文件的智能路由。
要使用express.static()
您在服务器上创建目录(可以在任何地方),但是人们经常将其放在服务器文件所在的目录下。我通常选择命名,public
因此对所有人来说这些文件都是公开可用的。然后,您可以使用express.static创建智能路由,如下所示:
app.use(express.static("/js", path.join(__dirname, "public")));
这行中间件告诉我们,如果有任何以开头的请求/js
,请在__dirname + "/public"
目录中查找匹配的文件。因此,如果有请求/js/functions.js
,则寻找名为的文件__dirname + "/public/functions.js"
。如果找到该文件,则将其自动提供。为了使它在index.html文件中正常工作,您可以将<script>
标签设为:
<script src="/js/functions.js"></script>
/js/
我在这里使用的前缀完全由您决定。您甚至不必使用前缀,并且可以将其命名为所需的任何名称。您只需要确保<script>
标记中使用的前缀与传递给的第一个参数中使用的前缀匹配即可express.static()
。我喜欢为我的静态JS和CSS文件使用前缀,以便在与我的核心HTML文件不同的位置存储和查找它们(这只是我的个人喜好,但在将来,它也可能使缓存变得更简单或使用类似NGINX的方法来简化性能)。
要使用它,express.static()
您必须express
通过更改以下内容来保存对模块的引用:
var app = require('express')();
对此:
var express = require('express');
var app = express();
或者,在任何最新版本的nodejs中,我更喜欢将其const
用于不应重新分配的变量:
const express = require('express');
const app = express();
问题内容: 我想像通常那样处理静态文件,但像通常那样处理动态路由 其中一位开发人员在此评论中提出了解决方案,但我不清楚他的意思。 问题答案: 好的。我在Express的response object 的源代码中找到了一个示例。这是该示例的稍作修改的版本。 它使用该方法。 注意 :安全性更改要求使用此选项。
我需要跟踪nodejs express提供的所有“静态”文件
问题内容: 我在这里有这段代码: 回调内部的代码未被调用。如果我注释掉该行,则回叫有效。我已经尝试过更改订单,但就像抽奖一样!我想知道这里出了什么问题。 我确信这与我对中间件如何调用缺乏知识有关。有人可以帮我理解这个问题吗? 基本上,我只想在提供文件和将index.html加载到浏览器之前执行一些逻辑。通过将道路的前行,没有的伎俩! 问题答案: 您的静态文件中间件应该优先。 并且您还应该为app.
问题内容: 我正在开发应用程序,并且服务器当前已安装并且运行良好。 这是访问服务器时显示的index.html: 但是,导入那些位于同一目录中的javascript文件时,出现404错误“无法加载资源:服务器响应状态为404(未找到)”。 这是我的服务器代码: 谢谢! 问题答案: 如果HTML文件与脚本位于相同的路径,请使用相对路径,例如。如果仍然不起作用,则可能是Express的错误。 将以下代
我们先来看看最简单的本地静态文件服务配置示例: server { listen 80; server_name www.test.com; charset utf-8; root /data/www.test.com; index index.html index.htm; } 就这些?
我使用了一种相当丑陋的方法: 正确的方法是什么?