Динамически обслуживать HTML как статический файл с Node.js - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь обслуживать каталог, который включает файл index.html в моем приложении Node.js.HTML-код предназначен для виртуальной реальности и визуализируется с некоторыми файлами javascript и three.js в каталоге. Я пытался использовать этот файл как статический файл, когда обрабатывал файл с URL-адресом "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)
            }
          }
        }) 
    //   }
    // })
})
...