使用Node.js将HTML作为静态文件动态提供服务

时间:2019-09-24 01:17:10

标签: javascript node.js dynamic server static-files

我正在尝试在Node.js应用程序中提供一个包含index.html文件的目录。该html用于虚拟现实,并在目录中包含一些javascript和three.js文件。当我使用以下代码行向网址为“ localhost:8080 /”的文件提供服务时,我尝试将其作为静态文件提供,效果很好:

app2.use('/', express.static('/Users/nancycollins/virtuload-beta/backend/uploads/7eef1d1f06439d8612a2409f75f545fb1569088983271/Nancy_Collins_118226967_v2'))

但是,只要我使它动态化,它就会说“无法获取”。我也不能在URL中添加任何内容,它只能以'/'开头。

当我向其添加变量时,它也可以工作:

const dir = '7eef1d1f06439d8612a2409f75f545fb1569088983271/Nancy_Collins_118226967_v2/'
app2.use('/', express.static('/Users/nancycollins/virtuload-beta/backend/uploads/${dir}'))

但是对于URL参数根本不起作用。我需要能够将整个目录作为静态文件提供服务,因为由于某种原因当我指定index.html文件时,该目录不起作用。

我想要以下函数根据req.param.id(保存到mongodb)找到文件的路径,其URL为“ localhost:8080/12345678”,但不能作为静态文件使用,但是它可以完美地获取文件的路径:

app2.use('/:id', express.static('/Users/nancycollins/virtuload-beta/backend/uploads/'))

app2.get('/:id', function(req, res, next) {
  let id = req.params.id
  console.log(id)
  Upload.findById(id)
    .populate('Upload')
    .select('relPath') //relPath = /folder/subfolder
    .exec(function (err, upload) {
      if (err) {
        console.log(err)
      } else {
          const dir = path.join(__dirname, 'uploads')
          const filepath = `${upload.relPath}`
          const fulldir = path.join(dir, filepath)
          fs.readdir(fulldir, function(err, items) {
          if (err) {
            console.log(err)
          } else {
            try {
              for (var i=0; i<items.length; i++) {
                  console.log(items[i]);
                  console.log(items.length);
                  var directpath = path.join(fulldir, items[0])
                  console.log(directpath)
                  // req.url = `/${directpath}`
                 // req.url = `${directpath}/index.html` 
                  res.sendFile('index.html', {root: directpath});
              }
            }
            catch (e) {
              console.error(e)
            }
          }
        }) 
        //next()
      }
    })
})

此函数获得与第一个和第二个代码示例中的硬编码完全相同的路径,但在提供服务时将不起作用。

我对此感到非常困惑,对此感到非常压力,我不知道自己在做错什么。

例如,我也尝试过更改函数中的url,而不是res.sendFile。

req.url = `${directpath}`

没有什么对我有用

编辑:

我将其更改为以下代码,该代码现在产生一条错误消息:“错误:找不到模块'html'”

app2.use('/', express.static(path.join(__dirname, 'uploads'), options))
const dirfile = '7eef1d1f06439d8612a2409f75f545fb1569088983271/'
app2.get('/', function(req, res, next) {
  // let id = req.params.id
  // console.log(id)
  // Upload.findById(id)
  //   .populate('Upload')
  //   .select('relPath') //relPath = /folder/subfolder
  //   .exec(function (err, upload) {
  //     if (err) {
  //       console.log(err)
  //     } else {
          const dir = path.join(__dirname, 'uploads')
          const filepath = dirfile
          const fulldir = path.join(dir, filepath)
          fs.readdir(fulldir, function(err, items) {
          if (err) {
            console.log(err)
          } else {
            try {
              for (var i=0; i<items.length; i++) {
                  console.log(items[i]);
                  console.log(items.length);
                  var directpath = path.join(fulldir, items[0])

                  console.log(directpath)
                  res.sendFile('index.html', {root: __dirname + 'uploads/7eef1d1f06439d8612a2409f75f545fb1569088983271/Nancy_Collins_118226967_v2'});
                  //express.static(`${directpath}`)
              }
            }
            catch (e) {
              console.error(e)
            }
          }
        }) 
    //   }
    // })
})

0 个答案:

没有答案