一尘不染

节点JS不提供静态图片

node.js

我已经添加了用于在节点服务器上提供图像的代码,但是在连接到Node时似乎不提供HTML中的图像。我还可以正确使用外部CSS和JS。这是我在Node中的代码片段(请参见下文)。先感谢您!

var server = http.createServer(function(req, res) {
    var pathname = url.parse(req.url).pathname;
    var ext = path.extname(pathname);
    var handler = handlers[req.url];
    if(ext) {
        if(ext === ".css"){
            res.writeHead(200, { "Content-Type" : "text/css" });
        }
        else if(ext === ".js") {
            res.writeHead(200, { "Content-Type" : "text/javascript" });
        }
        else if(ext === ".jpg") {
            res.writeHead(200, { "Content-Type" : "image/jpg" });
        }
        res.write(fs.readFileSync(__dirname + pathname, "utf8"));
        res.end();
    }
    else if(handler) {
        handler(req, res);
    }
    else {
        res.writeHead(404, { "Content-type" : "text/plain" });
        res.end();
    }
});
server.listen(80);

阅读 197

收藏
2020-07-07

共1个答案

一尘不染

当有人尝试实现自己的静态文件服务器而不是使用Express或有效的方法而无法使其工作时,我在Stack
Overflow上看到了很多类似的问题。如果可以实现自己的静态文件服务器,请执行此操作。如果不能,那么这可能表明它不是一个好主意。
更新:请参阅以下内容,了解不使用Express的解决方案。

问题

仅仅看一下您的代码,我已经看到了几个严重的问题,包括:

  1. 您的代码 不安全 -它允许任何人在您的系统上获取任何文件。

  2. 您的代码正在 阻止 -一旦获得任何并发连接,它将立即停止。

  3. 您的代码不适用于 二进制文件 -仅适用于文本文件,以及仅适用于UTF-8编码的文件

  4. 您的代码不适用于 大写文件名.jpeg扩展名等。

  5. 您的代码无法正确提供 HTML 文件

  6. 当文件不存在而不是使用正确的代码响应时,代码 崩溃

回答这样的问题的人有两种选择:要么花费大量的精力和时间来解决上面提到的每个问题(这种情况很少发生,因为这不是一项琐碎的任务,这就是为什么您只看到评论中提到一个或一个问题的原因。其中两个问题而不是答案),
或者 您可以解释应如何正确完成任务,而不是对最初不是一个好主意的事情添加无数次修复。

话虽这么说,您可以通过安全高效的方法来实现目标的方法是将您的静态文件(HTML,CSS,图像等)放入一个目录,例如html并使用Express(或其他一些框架)如下所示),并带有以下简单代码:

var path = require('path');
var express = require('express');
var app = express();

var htmlPath = path.join(__dirname, 'html');

app.use(express.static(htmlPath));

var server = app.listen(80, function () {
    console.log('listening on port', server.address().port);
});

查看完整的示例,并在GitHub上进行说明:

我将这个示例放在GitHub上是因为Stack
Overflow上存在许多与人们在Node中提供静态文件有关的问题。它是开源的,您可以使其适应自己的需求并在代码中使用。

有关Express的更多信息,请参见:

其他选择

您可以用来提供静态文件的其他框架包括:

没有框架

如果您仍然不希望使用能够正确完成工作的高级框架,并且想推出自己的解决方案(可能出于教育目的),
它说明了如何通过以下方式提供静态图片:

  1. express.staticexpress内置的中间件,就像这个答案)
  2. expressexpress但没有express.static
  3. connect(低于的一级express
  4. http(使用Node的http模块)
  5. net(甚至不使用http模块)

发布的所有示例均经过测试,可在节点版本4、5、6和7上运行。

2020-07-07