【问题标题】:Sending whole folder content to client with express使用快递将整个文件夹内容发送给客户端
【发布时间】:2017-03-23 10:08:24
【问题描述】:

我制作了一个 html5 游戏(使用 GameMaker),它由一个 index.html 和一个包含游戏依赖项的文件夹“html5game”组成 - javascript 代码和资源。问题是资源非常多且多样化(声音、精灵等),客户端需要它们全部播放。

我正在寻找一种方法将它们全部发送而不具体命名。

我尝试了 glob 模块:

var glob = require( 'glob' );    

var files = glob.sync( './html5game/**' ).forEach( function( file ) {
      require( path.resolve( file ) );
});

但是一旦我这样做了,我就想不出一种方法来使用 res.sendFile() 发送文件。

我试过了

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

[...]

app.get('/aeronavale/jeu', function(req, res){
        res.sendFile(__dirname + '/aeronavale/index.html');
        res.sendFile(files)

});

[...]

app.listen(3000, function(){
    console.log('app started on port 3000, yeah !')
})

但它给了我错误:

TypeError: path argument is required to res.sendFile

如果您有其他解决方案,我也有兴趣。感谢您的回答!

【问题讨论】:

    标签: javascript node.js express game-maker


    【解决方案1】:

    您将无法使用res.sendFile 发送多个类似的文件。您可以在这里做的最直接的事情是:

    将您的index.html 文件和您的html5game 目录放入某个公共目录,例如调用 html 并将它放在你有 Node.js 程序的地方。一个示例目录布局是:

    /home/you/yourapp:
    - app.js (your node program)
    - package.json (your package.json etc)
    - html (a new directory)
      - index.html (your main html to serve)
      - html5game (the directory with other files)
        - (other files)
    

    现在,在您的 Node 程序中,您可以使用如下内容:

    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(3000, function () {
        var host = 'localhost';
        var port = server.address().port;
        console.log('listening on http://'+host+':'+port+'/');
    });
    

    这将提供您的所有文件(包括index.html),地址如下:

    当然,您仍然需要确保在您的 index.html 文件中正确引用您的资产,例如:

    <script src="/html5game/xxx.js"></script>
    

    在上述示例布局的情况下。

    包含您的静态资产的顶级目录(您拥有index.html)通常称为staticpublichtml,但您可以随意命名,只要您使用正确的名称即可调用express.static() 的路径。

    如果您想让您的游戏在根路径以外的某个路径中可用,那么您可以将其指定为app.use。例如,如果你改变这个:

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

    到这里:

    app.use('/game', express.static(htmlPath));
    

    然后代替那些网址:

    这些 URL 将可用:

    这里的很多问题都与使用 Express 提供静态文件有关,所以我做了一个工作示例并将其发布在 GitHub 上,以便人们可以有一个工作起点并从那里开始:

    另请参阅我更详细讨论的其他一些答案:

    【讨论】:

    • 谢谢,我测试了一下,很快回来验证
    • 因此,使用此解决方案,我必须在服务器上创建一个我想要的文件夹结构,并且每个文件夹结构都必须包含一个 index.html ?
    • @Aninternhasnoname 是的,您可以在服务器上创建所需的结构 - 例如html 目录包含game1game2 等,每个目录都有自己的index.html 和一个带有资产的子目录 - 这将是最简单的一个,只需调用app.use(express.static(htmlPath)); - 或者您也可以拨打一个电话每场比赛:app.use('/game1', express.static(pathToGame1Files));app.use('/game2', express.static(pathToGame2Files)); 以您觉得更方便的为准。您甚至可以混合使用这两种方式,但注册路径的顺序很重要。
    • 非常感谢!如果你好奇,这是我刚刚上传的游戏:lapinou.dnet.ovh:3000/aeronavale/jeu 使用箭头和 X,我还没有制作教程 :)永远)
    • @Aninternhasnoname 这是一款非常酷的游戏! :) 它让我想起了一款出色的 DOS 游戏《狂暴之翼》——只有你的游戏使用了类固醇,而且难度更大。 ;) 很酷。完成教程后,请在推特上给我留言 - 我在推特上是 @pocztarski。保持良好的工作!我很高兴能帮上忙。
    【解决方案2】:

    解决方法是使用archiver library 压缩目录并在前端解压缩。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      相关资源
      最近更新 更多