【问题标题】:Setting up express to enable the use of static css and js files设置 express 以启用静态 css 和 js 文件的使用
【发布时间】:2015-01-03 02:40:45
【问题描述】:

我无法设置我的应用程序的中间件,以便它为我的一些静态文件提供服务,例如 css 和 js。我希望能够在我的 index.html 中包含公共目录中的 css 和 js 文件。

This is a picture of my current file structure.

这是我的快递服务器的代码。

server.js

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

//config
app.set('views', __dirname + '');
app.engine('html', require('ejs').renderFile);
//app.use(express.static(__dirname + '/')); worked when everything was in jqtest

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

//routes
app.get('',function(req,res){
    res.render('../public/views/index.html')
});

app.env
//server
app.listen(process.env.PORT || 5000);
console.log('app live in 5000');

这些是我试图在我的 index.html 中使用的 src 标签,但它们不起作用。我知道我可能还需要为位于组件中的 jquery 文件设置一个额外的 app.use。

index.html

<link rel="stylesheet" type="text/css" href="/public/css/style.css"/>
<script type="text/javascript" src="/components/jQuery/dist/jquery.js"></script>
<script type="text/javascript" src="/public/js/myJS.js"></script>

编辑 1 我已经公开了这个项目的 github。可用Here

编辑 2

已回答。非常感谢 teleaziz7zark7 帮助指导我完成这个过程。

解决方案:

第 1 步:

因此,在根目录之外删除应用程序服务器代码时的问题是 __dirname 不是全局变量。为我的静态文件设置路由的第一步是告诉我的服务器什么时候是新的根目录。我通过添加 teleaziz 提供的这行代码来做到这一点

var root = path.normalize(__dirname + '/..'); 

第 2 步:

一旦我这样做了,我必须按照 teleaziz 的建议更改公共路由以使用 root 而不是 __dir

app.use(express.static(root + '/public'));

第 3 步:

完成后,我按照 teleaziz 和 7zark7 的建议从我的 index.html 中的 src 中删除了 /public/。我的新 src 标签看起来像这样。

<link rel="stylesheet" type="text/css" href="/css/style.css"/>
<script type="text/javascript" src="/components/jQuery/dist/jquery.js"></script>
<script type="text/javascript" src="/js/myJS.js"></script>

【问题讨论】:

    标签: html node.js express


    【解决方案1】:

    __dirname 不是全局对象,(尽管在文档中是全局对象下的列表,这让读者感到困惑!)。它实际上仅限于模块范围,它总是引用包含模块的文件夹。在您的情况下,服务器文件夹不是您的项目根目录,

    所以看看你的文件结构让我们:

    • 首先需要路径模块来帮助规范化路径:

      var path = require('path');
      var root = path.normalize(__dirname + '/..');
      
    • 将您对 __dirname 的使用更改为 root:

      app.use(express.static(root + '/public'));
      

    【讨论】:

    • 嘿,谢谢你的建议。我已经实施了您在上面提供的更改。不幸的是,我的应用程序仍然无法在公共目录中获取我的 css 和 js 文件。Here is a link to the new server.js with your changes included。我保持 src 标签与上面列出的相同。感谢您抽出宝贵时间 - Fredk
    • 想一想,实际上第一个答案应该有效,也许我遗漏了一些东西:如果你在 jqtest/server/server.js 并且你想访问 jqtest/public/ 然后@987654326 @ 应该工作
    • 嘿,我刚刚尝试了您编辑的答案。它也没有成功。如果您想克隆,我已将我的 git hub 存储库公开。 Here is a link to the repository. 谢谢你所做的一切,-Fredk
    • 我刚刚看了看,所以公用文件夹应该是您资产的根目录,所以请确保将公用文件夹从href 中取出,这样就可以了。即'href='/css/style.css'
    • 哇,你说得对,它奏效了。我认为我已经尝试过了,但我想我做了其他导致它出错的事情。使用您告诉我最初进行的更改,他们从 src 中删除 /public 使其正常工作。谢谢。
    【解决方案2】:

    从这些中删除public

    <link rel="stylesheet" type="text/css" href="/css/style.css"/>
    <script type="text/javascript" src="/js/myJS.js"></script>
    

    通过映射:

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

    你不需要public

    【讨论】:

    • 您好,谢谢您的建议。我已经尝试过了,因为那是我对它应该如何工作的理解。但事实并非如此。 Here is the js filehere is the html file 将您的更改实施到其中。但它仍然没有正确路由。
    • 您是对的,但我仍然需要设置根文件夹,因为正如上面的 teleaziz 所述,__dirname 不是全局的,并且由于我将服务器代码移到了根目录之外,因此不确定根目录在哪里。非常感谢。 -弗雷德K
    • 我明白了,因为你在/server/下有server.js,我通常把它放在顶层,把/public作为子目录
    • 是的,如果我的 server.js 位于根目录中,您的解决方案将可以正常工作。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-06-08
    • 2016-08-28
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    相关资源
    最近更新 更多