【问题标题】:node.js, express.js - What is the easiest way to serve a single static file?node.js, express.js - 提供单个静态文件的最简单方法是什么?
【发布时间】:2012-07-13 11:43:24
【问题描述】:

我已经看到并使用过:

app.use("/css", express.static(__dirname + '/css'));

我不希望提供根目录中的所有文件,只提供一个文件“ipad.htm”。使用 express.js 以最少的代码量做到这一点的最佳方法是什么?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    res.sendFile(path_to_file); 就是你所需要的;它会自动设置正确的标题并传输文件(它在内部使用与express.static相同的代码)。

    在小于 4 的 express 版本中,使用 sendfile 而不是 sendFile

    【讨论】:

    • 我从中得到了 403。我不得不做res.sendfile(relativePath, {root: theDirectory})
    • 如果您的文件夹在运行的 JS 文件之一之外,我会在@kumar303 评论中添加一些细节:您不能将“../”放在 relativePath 中,但您可以将其添加到目录中。 res.sendfile(pic.png, {root: __dirname+"../../../images/"})
    • 这是app.get('css', function (req, res) { ... })吗?
    • 我发现像这样相对于项目根进行操作很有用:path.join(path.dirname(require.main.filename), '/relative/to/project/root/file.html ')
    • 在 Express 4.x 中,看起来全小写的 sendfile 已被弃用,取而代之的是带有大写 F 的 sendFile。以 uuid.js 为例,对我有用的是app.get('js/uuid.js', function(req, res) { res.sendFile('uuid.js', {root: 'node_modules/node-uuid'}); });
    【解决方案2】:
    app.use("/css/myfile.css", express.static(__dirname + '/css/myfile.css'));
    

    【讨论】:

    • app.use("/", express.static(__dirname + "/index.html")) 给我一个 404。 app.use("/", express.static(__dirname)) 工作。
    • 这很奇怪,它确实对我有用。我有 app.use('/', express.static(__dirname + '/wwwroot/index.html'));我认为他们 app.use 调用出现的顺序确实有所不同。因此,请确保您没有先将其映射到其他给出 404 的位置。
    • 我得到了一些奇怪的 303 行为,这些行为指向路径加上一个斜杠。似乎只有静态应该在目录上工作。
    • 与 serve-static 也一样。
    • 我没有将其用于index.html,因此无法对此发表评论——但此解决方案适用于标准/文件名指定的情况。 (快速版本:4.17.1)
    【解决方案3】:

    如果您只想提供单个静态文件,可以使用此语法(示例基于原始问题,根目录下的 ipad.htm):

    app.use('/ipad.htm', express.static(__dirname, {index: 'ipad.htm'}));
    

    express.static(dir) 的默认行为是它会尝试从所需的dir 发送一个“index.html”文件。 index 选项会覆盖此行为,并允许您选择预期的文件。

    【讨论】:

    • 唯一解决烦人的 favicon 404 请求的解决方案。 app.use('/favicon.ico', express.static('img/base', {index: 'favicon.ico'}));
    【解决方案4】:

    我发布了一个用于提供单个静态文件的小型库:https://www.npmjs.com/package/connect-static-file

    npm install connect-static-file

    var staticFile = require('connect-static-file'); app.use('/ipad', staticFile(__dirname + '/ipad.html'));

    与 express.static 的主要区别在于它不关心请求 url,如果路由匹配,它总是提供该文件。如果您将目录命名为“ipad.html”,它不会突然开始为整个目录提供服务。

    【讨论】:

    • 但是如何在我的代码中的其他地方引用静态文件?
    • “参考”是什么意思?您想在代码中的其他地方使用这些内容吗?如果是这样,您可以使用require('fs').readFile(pathOfTheFile, (err, data) => {...})
    【解决方案5】:

    以 JoWie 的回答为基础的快速示例:

    npm install 连接静态文件

    npm install express

    var express = require('express');
    var staticFile = require('connect-static-file');
    
    var path = 'pathto/myfile.txt';
    var options = {};
    var uri = '/';
    var app = express();
    var port = 3000;
    
    app.use(uri, staticFile(path, options));
    
    app.listen(port, () => console.log(`Serving ${path} on localhost:${port}${uri}`));
    

    【讨论】:

      【解决方案6】:
       fs.createReadStream(path).pipe(res);
      

      【讨论】:

      • 您至少需要事先明确写出 Content-TypeContent-Length 标头。
      猜你喜欢
      • 2013-01-12
      • 2016-01-30
      • 2014-11-24
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      相关资源
      最近更新 更多