代码之家  ›  专栏  ›  技术社区  ›  Lukas Bach

expressjs静态文件服务总是为同一个文件服务

  •  1
  • Lukas Bach  · 技术社区  · 7 年前

    我有一个expressjs设置,如下所示:

    // Imports...
    const app: express.Application = express();
    const port: number = 3001;
    
    const listener = new StatementListenerAPI();
    app.use('/listen', listener.getRouter());
    
    app.use('/welcome', router);
    
    
    if (fs.existsSync('./client')) {
        // Running in prod environment with pre built client directory. Serve this.
        app.use(express.static('./client'));
    }
    
    app.listen(port);
    

    所以我有一些路由器连接到express应用程序,在底部我声明 client 应该是静态的。这个目录包含index.html以及许多js、css和png文件。但是,无论我尝试从express服务器访问哪个url,它总是在静态服务目录中显示index.html的代码。对index.html中使用的js和css文件的引用也只是返回index.html的代码。

    我正在使用ExpressJS 4.16.3

    我做错什么了?

    编辑:所以从技术上讲,如果使用 __dirname + '/client' 而不是 ./client 是的。我现在得到的是,当从邮递员(因此“手工”http请求)发出get请求时,我总是得到正确的结果。如果我从我的web浏览器中调用资源,它仍然会显示网站(解析index.html)。但是,现在所有的资源,比如js和css脚本,都被正确地解析了,所以看起来chrome可以正确地解析这些依赖关系,我只是想知道为什么在通过chrome请求一些资产或一些express端点时,仍然会得到index.html的内容。通过代码进行的api调用运行良好,所以手动chrome请求显示这种奇怪行为的唯一原因,在这一点上,我只是出于好奇而提出请求。

    1 回复  |  直到 7 年前
        1
  •  2
  •   nijm    7 年前

    回答你原来的问题:

    提供给的路径 express.static 应该相对于启动节点进程的目录或绝对路径。为了安全起见,构造一个绝对路径(即从当前目录或文件)。例如:

    app.use(express.static(__dirname + '/client'));
    

    关于你的后续问题:

    我认为这是因为chrome使用了大量缓存,它认为这个文件夹应该返回html文件。你可以试试 reset all caches in Chrome ,或仅用于页面。

    推荐文章