EJS и Express, не могу понять, как загружать статические файлы из корневого пути

#node.js #express #ejs

#node.js #экспресс #ejs

Вопрос:

Этот вопрос в основном связан с моей настройкой, поэтому, пожалуйста, потерпите, пока я пытаюсь это объяснить.

Моя структура папок выглядит следующим образом:

 .
├── server/
│   └── index.ts // the file that starts my server
├── pages/
│   └── index.ts // Generates index page
└── views/
    └── index.ejs // An ejs view
└── js/
    └── index.js // A simple js file with a console log in it
  

Я запускаю экспресс-сервер, с server/index.ts которого ищет файлы внутри pages каталога.

 import * as express from "express";

const app = express();

app
  .set("view engine", "ejs")
  .get("*", function handler(req, res) {
    const _found = require(`${process.cwd()}/pages${req.url}`);
    res.render(_found.default(), {});
  })
  .listen(3000, () => console.log("Started on http://localhost:3000"));
  

Мои файлы страниц довольно просты, они выглядят так:

 function Index(): string {
  return `index.ejs`;
}

export default Index;
  

Я использую эти файлы, чтобы указать своему серверу, какой шаблон ejs использовать для этой конкретной страницы. В приведенном выше случае я возвращаюсь index.ejs , который сообщает моему серверу найти views/index.ejs .

Это отлично работает, по крайней мере, до тех пор, пока я не попытаюсь включить какие-либо статические файлы в свои шаблоны ejs.

 <html>
  <body>
    <script src="/js/index.js"></script>
    <h1><%= pageName %></h1>
  </body>
</html>
  

По какой-то причине, если я загружу этот шаблон ejs способом, описанным выше, сервер попытается выполнить поиск /js/index.js внутри pages/js/index.js , а не /js/index.js .

Я пытался использовать относительный путь:

 <script src="../js/index.js"></script>
  

Но это не сработало.

Я не могу поместить свои статические файлы в pages каталог, так как это нарушит работу моего сервера.

Как я могу помешать express искать файлы в неправильной папке?

Ответ №1:

Express, по-видимому, может установить статическую папку, поэтому я сменил свой сервер на:

 app
  .set("view engine", "ejs")
  .use("/public", express.static("public"))
  .get("*", function handler(req, res) {
    const _found = require(`${process.cwd()}/pages${req.url}`);
    res.render(_found.default(), {});
  })
  .listen(3000, () => console.log("Started on http://localhost:3000"));
  

Затем я переместил свои статические файлы в public/js/index.js и загрузил их <script src="/public/js/index.js"></script> .

Это работает так, как должно!