【问题标题】:Node.js: My HTML requires an imageNode.js:我的 HTML 需要图像
【发布时间】:2016-08-27 18:12:43
【问题描述】:

看,我正在使用 Node(和 TS btw)进行培训,并尝试使用多个请求/响应选项做一个简单的服务器。但是我有一个问题,如果不使用 Express,我不知道如何解决(至少现在我不想使用它)。

我有一个请求图像文件的 HTML 文件。在 IDE 中,一切看起来都可以正常工作,但是当服务器运行时,找不到映像。原因很明显:HTML 发出了一个服务器不知道如何处理的请求。问题是,我认为该文档可以引用其他文件而无需与服务器对话。

对于我的问题,什么是优雅且有效的解决方案?

提前致谢。

import * as http from 'http'
import * as fs from 'fs'

fs.readFile('doc/kmCNHkq.jpg', function (err, data) {
    let binaryimg = new Buffer(data).toString('base64'); 
    if (err) throw err;

    http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'image/jpeg'});
        res.end(data);
        console.log("Delivered the jpeg");
    }).listen(8000); 

    http.createServer(function(req, res) {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end(binaryimg);
        console.log("Delivered base64 string");
    }).listen(8124);

    console.log("Unless bug, both servers are listening");
});

fs.readFile('doc/index.html', function(err, data) {
    http.createServer(function(req,res) {
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.end(data)
    }).listen(80);
    console.log("HTML server is running")
})

(main.ts; 目标 ES6)

<html>
    <head>

    </head>

    <body>
        <img src="doc/kmCNHkq.jpg"/>
    </body>
</html>

(index.html)

观察:我以前将 HTML 文件放在“../doc/”中,将资源放在“../img/”中,但似乎 HTML 使用相对路径,所以我将图像复制到 HTML 的文件夹中。如果解决方案也成功了,我可以将资源留在他们各自的文件夹中,我们将不胜感激。

@编辑: 现在我正在使用这个 switch/case 请求处理程序。按预期工作,HTML 对图像的请求被解释为正常请求(可能最终无法很好地缩放,idk,但搞砸了)。非常感谢!

import * as http from 'http'
import * as fs from 'fs'

var stream: fs.ReadStream,
    folder = __dirname.substr(0, __dirname.length - 3);

http.createServer(function(req,res) {
    switch (req.url){
        case('/jpeg'):
            stream = fs.createReadStream(folder + 'img/kmCNHkq.jpg');
            stream.pipe(res);

            console.log("Delivering the jpeg");
            break;

        case('/base64'):
            fs.readFile('img/kmCNHkq.jpg', function (err, data) {
                let img64 = new Buffer(data).toString('base64');
                if (err) throw err;
                res.end(img64);

                console.log("Delivered base64 string");
            })

            break;

        case('/html'):
            stream = fs.createReadStream(folder + 'doc/index.html');
            stream.pipe(res);

            console.log("Sending the docs");
            break;

        default:
            console.log("Shit happens");
    }
}).listen(80)

(main.ts)

<html>    
    <body>
        <img src="jpeg"/>
    </body>
</html>

(index.html)

【问题讨论】:

    标签: html node.js path typescript server


    【解决方案1】:

    简答:

    除非您的服务器知道如何响应对这些内容的请求,否则您将无法引用服务器上的特定资源(例如您的图片)。看起来您可以通过将图像 src 更改为 http://localhost:8000 来使您的示例立即轻松运行。

    更长的答案:

    使用“doc/kmCNHkq.jpg”作为图像的源代码告诉您的浏览器,当它加载页面时,它应该转到从中获取页面的服务器,并要求它提供“doc/kmCNHkq.jpg” '资源。如果您指定一个包含协议 (http://) 的完整 URL,那么它将是绝对的,而不是相对的,因此您可以从与提供该页面的服务器不同的服务器请求。

    您编写的服务器实际上并不查看所请求文件的路径 (req.url),实际上它们总是返回相同的内容。如果您连接到http://localhost:80(您在上面创建的第三台服务器),并请求该 jpg,您仍然会得到页面的相同 HTML 数据,因为它只是在您的 createServer 调用中运行两行你的例子结束。您编写了一个始终返回上述图像的服务器(第一台服务器),只是在不同的端口上运行,这就是上述解决方案有效的原因。

    仅使用现有服务器是最简单的解决方案。不过,更传统的方法是在单个端口上运行一个 HTTP 服务器(而不是您拥有的 3 个),并使用 req.url 来决定要返回哪些数据。

    传统上对于静态内容,意味着将请求的路径直接映射到磁盘上文件的布局上,以便请求 doc/abc.jpg 在服务器目录中查找 doc 文件夹,并从其中返回 abc.jpg 中的数据.不过,这根本不是必需的,您的服务器可以根据您的喜好解释这些路径,以从任何地方返回内容。

    (请注意,这与 TypeScript 无关,甚至与 Node.js 无关。这实际上只是 HTTP 服务器和浏览器交互的基本要素,它几乎与任何其他支持技术。如果您想了解更多背景知识,我会详细了解一般 HTTP 和浏览器详细信息。)

    【讨论】:

    • 正是我想要的。看,我只引用了 TS 和 Node,以便人们知道如何阅读代码。然而,想要的解决方案是结构性的。我一直都知道多个端口非常笨重,所以“IncomingMessage.url”的建议确实很有帮助。我将向您展示代码是如何结束的。仍有改进的余地,但肯定会更好。
    猜你喜欢
    • 2012-09-20
    • 2018-11-20
    • 1970-01-01
    • 2011-11-01
    • 2010-11-20
    • 2021-04-13
    • 2011-05-15
    • 1970-01-01
    • 2022-01-27
    相关资源
    最近更新 更多