ExpressJs - express.static(__ dirname)指向哪里?

时间:2013-09-19 22:21:32

标签: javascript node.js express

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指向哪里?。

2 个答案:

答案 0 :(得分:21)

在Node中,__dirname是一个全局对象,包含执行脚本所在目录的名称。例如,如果您从node script.js开始运行/home/user/env,那么__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识别和文件服务。
  6. 以下是来自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);
      };
    };
    

答案 1 :(得分:19)

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 + '/')); 

静态中间件处理从目录提供内容。在这种情况下,“root”目录被提供,任何内容(HTML,CSS,JavaScript)都可用。 这意味着如果根目录如下所示:

index.html
js - folder
css - folder

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