作者:悠闲自在的鱼叫_688 | 来源:互联网 | 2023-12-12 14:38
本文介绍了如何使用ExpressApp提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。
我有一个Express提供的React应用。整个应用程序包含在public / index.html中。
现在,我的server.js如下所示:
1 const express = require('express');
2 const path = require('path');
3 const port = process.env.PORT || 8080;
4 const app = express();
5
6 // the __dirname is the current directory from where the script is running
7 app.use(express.static(__dirname));
8
9 app.get('*',(req,res) => {
10 res.sendFile(path.resolve(__dirname,'public/index.html'));
11 });
12
13 app.listen(port);
但是,以某种方式提供了诸如package.json和/.ssh/known_hosts之类的文件,这些东西显然不应该使用。
我不确定为什么app.get('*',res)...
不能捕获所有请求,为什么app.use(express.static(__dirname));
似乎是允许我的应用程序处理任何静态文件的唯一配置。
我没有app.use(express.static(__dirname+'/public'));
或
的运气
app.use( '/',express.static(__dirname + '/public'));
或其他我能找到的东西。
编辑---
我的项目目录如下:
/myproject
package.json
server.js
/public
index.html
我希望所有请求都只提供index.html
我仍然不明白的是为什么
app.use('*',express.static(path.resolve(__dirname,'/public/index.html')));
不提供任何服务。
此外,为什么在上面的示例中,res.sendFile()在不首先调用express.static()的情况下什么也不做。如果我删除第7行,则没有任何内容。
所以,永远不要这样做:
app.use(express.static(__dirname));
在您的主服务器目录中。这样便可以查看您所有的服务器文件。
使用express.static()
服务整个目录时,应创建一个仅包含供公众使用的文件的目录,然后指向express.static()
。
我不确定为什么app.get('*',(req,res)...不能捕获所有请求
因为app.get('*',...)
在您的express.static()
之后,所以如果express.static()
找到匹配的文件,则app.get('*',...)
甚至看不到请求。已经处理,路由不再继续。
与express.static()
一如既往地就您应该做的事情提供建议,我们需要知道您所拥有的精确配置。文件系统中相对于主服务器目录的公共文件在哪里,以及您打算在客户端中使用哪些URL来引用那些公共可用的文件。
这是一个理论上的例子(因为您没有提供详细信息):
假设您有这样的文件:
/myproject
app.js
/public
main.css
并且,假设您希望能够使用/main.css
作为客户端的URL。为此,您只需要在app.js中进行此操作:
app.use(express.static(path.join(__dirname,"public")));
在第一个示例中,您将在顶级路径中提供这些静态文件,然后必须确保这些顶级资源与您要提供的任何实际路由之间都没有命名冲突。
如果您希望客户端URL为/assets/main.css
,则可以这样做:
app.use("/assets",express.static(path.join(__dirname,"public")));
在此示例中,您必须确保/public
子目录(及其可能包含的任何子目录)仅包含旨在公开访问的文件。
在公共URL中添加路径,例如/assets
消除了静态资产与顶级路由之间命名冲突的可能性。这可能是一件好事,因为在任何多人项目中,处理静态资产(例如CSS文件)的人员与处理服务器路由的人员不同的情况并不少见,因此这两个主要人员不会直接知道什么名称对方正在使用。在单人项目中,您一定会把它全放在脑子里,这样可以避免意外的命名冲突。
仅供参考,我更喜欢文件夹组织:
/myproject
/server
app.js
/public
main.css
哪些是服务器文件,哪些是公共文件在100%明显。然后,要使用/assets/main.css
的URL从app.js中提供公共文件,我将这样做:
app.use("/assets","../public")));
根据您的评论:
我只想为所有('*')GET请求提供public / index.html。所有其他数据均来自单独的API。似乎res.sendFile()必须先使用express.static才能工作。上面的代码驻留在server.js中
如果您要做的只是为所有请求提供public/index.html
(其中public
是app.js
所在的子目录),请删除{{1} }完全是中间件。
只需在app.js中使用它:
express.static()
,
删除O(n**3)
这表明表示要加载所有存在的文件
,
app.use(express.static(__dirname));
将使您的应用程序不安全。
始终在控制台中打印出path.resolve(__dirname,'public/index.html')
之类的URL,以了解其中是否存在问题。似乎针对静态文件的根目录会出现问题。将它们放在常规的公共目录中,然后重试