【问题标题】:ExpressJs - where express.static(__dirname) point to?ExpressJs - express.static(__dirname) 指向哪里?
【发布时间】:2013-09-25 04:45:55
【问题描述】:
var express = require('express');
var app = express();
port = process.argv[2] || 8000;

app.configure(function () {
    app.use(
        "/", 
        express.static(__dirname) 
    );
});
app.listen(port);

我删除了下面的这行,在加载 localhost 时出现错误

app.configure(function () {
        app.use(
            "/", 
            express.static(__dirname) 
        );
    });
  1. app.use 方法有什么作用?。
  2. express.static 方法有什么作用? __dirname 指向哪里?

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    在 Node 中,__dirname 是一个全局对象,其中包含执行脚本所在目录的名称。例如,如果您从/home/user/env 运行node script.js,那么__dirname 将包含`/home/user/env

    app.use() 方法是继承自 Connect 框架的函数,该框架是 Express 所写的框架。该方法将一个中间件函数附加到应用程序堆栈,该函数在 Express 每次收到请求时运行。

    您显示的代码将静态服务器安装到路径/,该路径从执行脚本的目录读取:

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

    如果您要将路径更改为/path,则静态文件服务器将改为从该路径提供静态文件。如果不指定路径,则默认使用/

    至于express.static() 自己做什么,它接受一个路径并返回一个监听请求的中间件函数。这就是中间件的工作原理:

    1. 检查请求方法是GET还是HEAD。如果两者都没有,请忽略该请求。
    2. 解析路径并暂停请求。
    3. 检查是否有默认重定向。如果是这样,请使用 HTTP 303 重定向。
    4. 定义遇到目录或错误的处理程序。
    5. 将所有内容传递给 send 模块,以进行 MIME 识别和文件服务。

    这是来自 Connect 的 static() 中间件源供参考:

    exports = module.exports = function(root, options) {
      options = options || {};
    
      // root required
      if (!root) throw new Error('static() root path required');
    
      // default redirect
      var redirect = false !== options.redirect;
    
      return function staticMiddleware(req, res, next) {
        if ('GET' != req.method && 'HEAD' != req.method) return next();
        var path = parse(req).pathname;
        var pause = utils.pause(req);
    
        function resume() {
          next();
          pause.resume();
        }
    
        function directory() {
          if (!redirect) return resume();
          var pathname = url.parse(req.originalUrl).pathname;
          res.statusCode = 303;
          res.setHeader('Location', pathname + '/');
          res.end('Redirecting to ' + utils.escape(pathname) + '/');
        }
    
        function error(err) {
          if (404 == err.status) return resume();
          next(err);
        }
    
        send(req, path)
          .maxage(options.maxAge || 0)
          .root(root)
          .index(options.index || 'index.html')
          .hidden(options.hidden)
          .on('error', error)
          .on('directory', directory)
          .pipe(res);
      };
    };
    

    【讨论】:

      【解决方案2】:

      app.use 方法有什么作用?

      Express 有一个Middleware,可以使用 app.configure 进行配置,我们可以在其中调用 use app.use()Middleware 被路由使用,让我打电话 app.use(express.bodyParser()) 将此层添加到我的 Middleware 堆栈中。这确保了对于所有传入的请求,服务器都会解析 Middleware 处理的正文。发生这种情况是因为我们将图层添加到 Middleware 中。

      http://www.senchalabs.org/connect/proto.html#app.use

      express.static 方法是什么? __dirname 指向哪里?

      代码创建一个 Express 服务器,添加静态 Middleware,最后开始监听端口 3000 或提供的端口。

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

      上面的代码相当于下面的代码,让你明白。

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

      静态中间件处理提供目录中的内容。在这种情况下,提供了“根”目录,并且任何内容(HTML、CSS、JavaScript)都将可用。 这意味着如果根目录看起来像:

      index.html
      js - folder
      css - folder
      

      有关同一主题的更多参考资料,以下是相关的 stackoverflow 链接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        • 2021-12-07
        相关资源
        最近更新 更多