【问题标题】:Learning Node - Express Public folder not working学习节点 - Express 公共文件夹不工作
【发布时间】:2014-08-17 11:54:06
【问题描述】:

所以我是 node 新手,正在尝试学习如何使用 express 库。但是,我试图弄清楚的问题是为什么我的/public 文件夹中的文件似乎没有作为静态内容提供。

这是我的代码:

var http = require('http');
var port = process.env.port || 1337;
var express = require('express');
var handlebars = require('express3-handlebars');
var path = require('path');

var application = express();

application.use(express.static(path.join(__dirname, 'public')));

application.engine('handlebars', handlebars({ defaultLayout: 'main' }));

application.get('/', function(req, res){
    res.render('index.handlebars', { someProp: 3 });
});

application.listen(port);

还有我的目录结构:

/
  - server.js (the above referenced file)
  / Views
    - index.handlebars
    / Layouts
      - main.handlebars
  / public
    - ServeMe.txt

我的理解是application.use(express.static(path.join(__dirname, 'public'))); 应该配置服务器以响应公共文件夹下的任何请求,如果找到该资源。我究竟做错了什么?有趣的是,将把手配置为视图引擎比让这个公用文件夹工作更容易=D

编辑:我试图请求的完整 URL: http://localhost:1337/public/serveme.txt

我试过区分大小写(这应该不是问题),但也没有用。

【问题讨论】:

  • 有错误信息吗?
  • 只是404,所以服务器似乎不知道如何处理请求。

标签: node.js express static-files


【解决方案1】:

我尝试请求的完整 URL:http://localhost:1337/public/serveme.txt

那是你的问题。您指定为静态内容的目录中的任何内容都可以直接从基本 URL 获得。您需要改为请求http://localhost:1337/serveme.txt

如果您只想提供来自/public 的静态文件,您可以传递一个字符串作为第一个参数:

application.use("/public", express.static(path.join(__dirname, 'public')));

【讨论】:

  • 啊,这很有趣。有没有办法强制包含公共网址?我想这只是我必须习惯的另一个约定。
  • @Tejs - 我已经用一种方法更新了我的答案。您可以将字符串作为任何中间件函数的第一个参数传递,如果请求的 URL 不匹配,该函数将不会运行。
【解决方案2】:

来自Express API reference

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

此行在您应用的根 URL 处为您的公用文件夹提供服务,这意味着以下请求是有效的并且不会给出 404 错误。

// GET /javascripts/jquery.js // GET /style.css // GET /favicon.ico

app.use 还接受一个可选的第一个参数,它允许您指定要在哪个请求 URL 上提供内容。第一个参数默认为“/”,这意味着您的静态内容将在基本 URL 上提供。如果您希望您的静态内容不在根级别提供,就像您的代码当前所做的那样,请查看以下示例(再次取自文档)

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

此行再次为您的公用文件夹提供服务,但在您应用的 /static URL 上,使以下请求有效且没有 404 错误。

(示例网址:http://localhost:1337/static/anythingInYourPublicFolder

// GET /static/javascripts/jquery.js // GET /static/style.css // GET /static/favicon.ico

【讨论】:

    【解决方案3】:

    您要加载哪些 URL?您应该在您的 URL 中包含“public”,所以curl -v 'http://localhost:1337/ServeMe.txt'

    【讨论】:

      猜你喜欢
      • 2018-06-22
      • 2016-08-22
      • 2020-07-29
      • 2015-03-04
      • 2011-07-10
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多