Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 代码不';t在Public文件夹中提供静态html文件_Javascript_Node.js_Express_Middleware - Fatal编程技术网

Javascript 代码不';t在Public文件夹中提供静态html文件

Javascript 代码不';t在Public文件夹中提供静态html文件,javascript,node.js,express,middleware,Javascript,Node.js,Express,Middleware,探索express框架。正在学习express.static中间件,但它的工作方式与我预期的不同 代码: 上面的代码不提供Public文件夹中的静态html文件。公用文件夹与此JS文件位于同一目录中,例如,当我使用URL尝试访问公用文件夹中的home.html文件时,我无法访问它 当我改变express.static是最后一个的顺序时,它确实提供了公用文件夹中的静态html文件 代码: 问题: 为什么在第一个代码示例中我的应用程序不提供静态文件?这两个代码片段之间有一个基本的区别。您看到的第一个

探索express框架。正在学习express.static中间件,但它的工作方式与我预期的不同

代码: 上面的代码不提供Public文件夹中的静态html文件。公用文件夹与此JS文件位于同一目录中,例如,当我使用URL尝试访问公用文件夹中的home.html文件时,我无法访问它

当我改变express.static是最后一个的顺序时,它确实提供了公用文件夹中的静态html文件

代码: 问题:
为什么在第一个代码示例中我的应用程序不提供静态文件?

这两个代码片段之间有一个基本的区别。您看到的第一个基本上是调用函数express.static,在您声明的中间件的回调函数中有参数“public”,这只会返回一个函数,该函数不会在下一个中间件中使用,因为没有参数传递给它;req对象应该被传递给它。但是,在第二个函数中,这将返回一个函数,该函数可以使用req对象,该对象通常在app.use中随res一起传递。看看“静态”函数的一些源代码,了解一下:

 function serveStatic (root, options) {
  if (!root) {
    throw new TypeError('root path required')
  }

  if (typeof root !== 'string') {
    throw new TypeError('root path must be a string')
  }

  // copy options object
  var opts = Object.create(options || null)

  // fall-though
  var fallthrough = opts.fallthrough !== false

  // default redirect
  var redirect = opts.redirect !== false

  // headers listener
  var setHeaders = opts.setHeaders

  if (setHeaders && typeof setHeaders !== 'function') {
    throw new TypeError('option setHeaders must be function')
  }

  // setup options for send
  opts.maxage = opts.maxage || opts.maxAge || 0
  opts.root = resolve(root)

  // construct directory listener
  var onDirectory = redirect
    ? createRedirectDirectoryListener()
    : createNotFoundDirectoryListener()

  return function serveStatic (req, res, next) { // the funciton returned
    if (req.method !== 'GET' && req.method !== 'HEAD') {
      if (fallthrough) {
        return next()
      }

      // method not allowed
      res.statusCode = 405
      res.setHeader('Allow', 'GET, HEAD')
      res.setHeader('Content-Length', '0')
      res.end()
      return
    }

    var forwardError = !fallthrough
    var originalUrl = parseUrl.original(req)
    var path = parseUrl(req).pathname

    // make sure redirect occurs at mount
    if (path === '/' && originalUrl.pathname.substr(-1) !== '/') {
      path = ''
    }

    // create send stream
    var stream = send(req, path, opts)
    //rest of code...

这两个片段在本质上存在差异。您看到的第一个基本上是调用函数express.static,在您声明的中间件的回调函数中有参数“public”,这只会返回一个函数,该函数不会在下一个中间件中使用,因为没有参数传递给它;req对象应该被传递给它。但是,在第二个函数中,这将返回一个函数,该函数可以使用req对象,该对象通常在app.use中随res一起传递。看看“静态”函数的一些源代码,了解一下:

 function serveStatic (root, options) {
  if (!root) {
    throw new TypeError('root path required')
  }

  if (typeof root !== 'string') {
    throw new TypeError('root path must be a string')
  }

  // copy options object
  var opts = Object.create(options || null)

  // fall-though
  var fallthrough = opts.fallthrough !== false

  // default redirect
  var redirect = opts.redirect !== false

  // headers listener
  var setHeaders = opts.setHeaders

  if (setHeaders && typeof setHeaders !== 'function') {
    throw new TypeError('option setHeaders must be function')
  }

  // setup options for send
  opts.maxage = opts.maxage || opts.maxAge || 0
  opts.root = resolve(root)

  // construct directory listener
  var onDirectory = redirect
    ? createRedirectDirectoryListener()
    : createNotFoundDirectoryListener()

  return function serveStatic (req, res, next) { // the funciton returned
    if (req.method !== 'GET' && req.method !== 'HEAD') {
      if (fallthrough) {
        return next()
      }

      // method not allowed
      res.statusCode = 405
      res.setHeader('Allow', 'GET, HEAD')
      res.setHeader('Content-Length', '0')
      res.end()
      return
    }

    var forwardError = !fallthrough
    var originalUrl = parseUrl.original(req)
    var path = parseUrl(req).pathname

    // make sure redirect occurs at mount
    if (path === '/' && originalUrl.pathname.substr(-1) !== '/') {
      path = ''
    }

    // create send stream
    var stream = send(req, path, opts)
    //rest of code...
是一个返回另一个函数(中间件)的函数,Express中间件需要2或3个参数(req、res[、next])

当它用作回调时,如下所示:

app.use(express.static('public'));
您不需要显式地向它提供参数,因为
app.use
将为您提供这些参数

但是,当您自己使用该函数时,需要使用其参数显式调用该函数:

app.use((req, res, next) =>{
    express.static('public')(req, res, next);
    next();
});
在第一个示例中,您正在生成中间件,但没有执行它。

是一个返回另一个函数(中间件)的函数,Express middleware需要2或3个参数(req,res[,next])

当它用作回调时,如下所示:

app.use(express.static('public'));
您不需要显式地向它提供参数,因为
app.use
将为您提供这些参数

但是,当您自己使用该函数时,需要使用其参数显式调用该函数:

app.use((req, res, next) =>{
    express.static('public')(req, res, next);
    next();
});
在第一个示例中,您正在生成中间件,但没有执行它