ExpressJs - where express.static(__dirname) point to?

前端 未结 2 999
伪装坚强ぢ
伪装坚强ぢ 2021-01-31 21:49
var express = require(\'express\');
var app = express();
port = process.argv[2] || 8000;

app.configure(function () {
    app.use(
        \"/\", 
        express.static         


        
2条回答
  •  迷失自我
    2021-01-31 22:17

    In Node, the __dirname is a global object that contains the name of the directory that the executing script resides from. For example, if you are running node script.js from /home/user/env, then __dirname will contain `/home/user/env.

    The method app.use() is a function inherited from the Connect framework, which is the framework Express is written on. The method attaches a middleware function to the application stack, which runs every time Express receives a request.

    The code you showed mounts a static server to the path / that reads from the directory the script is executing from:

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

    If you were to change the path to /path, then the static file server will serve static files from that path instead. If you specify no path, then / is used by default.

    As for what express.static() does itself, it accepts a path and returns a middleware function that listens on requests. This is how the middleware works:

    1. Check if the request method is GET or HEAD. If neither, ignore the request.
    2. Parse the path and pause the request.
    3. Check if there is a default redirect. If so, redirect with a HTTP 303.
    4. Define the handlers for if a directory or error is encountered.
    5. Pass everything to the send module for MIME identification and file serving.

    Here is the static() middleware source from Connect for reference:

    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);
      };
    };
    

提交回复
热议问题