Node Express-请求任何文件返回404未找到



我已经部署了一个带有Express的AWS LightSail Node服务器。在端口3000上正确启动应用程序将激活app.js并在浏览器中显示投影字符串(http://my.ip.address:3000):欢迎使用白板服务器!这是端口3000上的主页,基本目录为:/opt/bitnami/apache/htdocs/白板

这是app.js:

const express = require("express");
const app = express();
const port = 3000;
global.__basedir = __dirname;
app.use(express.json());
app.listen(port, () => {
console.log(`Whiteboard listening on port: ${port}`);
});
app.get("/", (req, res) => {
res.send(`Welcome to the Whiteboard server! this is the home page on port ${port} with base dir: ${__basedir}`);
});

然而,尝试请求根文件夹中的任何文件(…apache/htdocs/白板(,例如:

http://my.ip.address:3000/Jeanette_Blog1.png

http://my.ip.address:3000/index.html

总是在浏览器中返回以下消息:

无法获取/Jeanette_Blog1.png

在控制台中显示为404错误。

顺便说一句,虽然路径显示的是apache,但我实际上已经安装了带有所需模块和express的node,这可以在这里的app.js文件中看到。apache只是AWS LightSail通过其合作伙伴Bitnami创建的节点映像的一部分。

我错过了什么?

默认情况下,express服务器本身不提供任何文件。如果要为静态文件的目录或目录层次结构提供服务,则必须在路由定义中使用express.static()(或类似的东西(。

您不应该将express.static()配置为指向包含服务器代码的同一目录,因为这将使人们能够查看您的服务器文件。制作一个子目录(通常称为"/public"(是一种流行的惯例,它位于服务器文件的下面或同一级别。下面是一个为同一级别的目录配置express.static()的示例。您可以添加以下行:

app.use(express.static(path.join(__dirname, "../public")));

而且,一切看起来都是这样的:

const express = require("express");
const app = express();
const path = require('path');
const port = 3000;
global.__basedir = __dirname;
// serve public files    
app.use(express.static(path.join(__dirname, "../public")), {index: false});
app.use(express.json());
app.listen(port, () => {
console.log(`Whiteboard listening on port: ${port}`);
});
app.get("/", (req, res) => {
res.send(`Welcome to the Whiteboard server! this is the home page on port ${port} with base dir: ${__basedir}`);
});

然后,您可以将静态文件(如index.htmlJeanette_Blog1.png(移动到/public目录中。它们可以从浏览器中称为URLS,例如/index.html/Jeanette_Blog1.pngexpress.static()中间件将检查传入路径,看看它是否与/public目录中的文件名匹配,如果匹配,它将为其提供服务。如果不匹配文件,它将继续路由到您定义的其他路由处理程序。

最新更新