Я не могу заставить express.static () работать на меня

#node.js #express

#node.js #выразить

Вопрос:

Хотя я не новичок в node или express (что делает это еще более неприятным), но на этот раз я не могу заставить express.static работать на меня. Ниже приведена моя структура каталогов.

 ├── node_modules
│   ├── accepts
│   │   ├── HISTORY.md
│   │   ├── LICENSE
.
.
.
.
├── favicon.ico
├── package-lock.json
├── package.json
├── mynode.js
└── stk
    ├── img
    │   ├── img1.jpg
    │   └── img2.jpg
    ├── index.html
    └── index2.html
  

Это мой js-файл

 const express = require('express');
const app = express();
const http = require("http");
const https = require("https");
const fs = require("fs");
var privateKey = fs.readFileSync("/etc/letsencrypt/live/xxxxxxxxx/privkey.pem","utf8");
  var certificate = fs.readFileSync("/etc/letsencrypt/live/xxxxxxxxx/fullchain.pem","utf8");
  var credentials = { key: privateKey, cert: certificate };
  var server = https.createServer(credentials, app);


app.use(express.static('stk'));
server.listen(8080);

app.get("/", function (req, res) {
    res.sendFile(__dirname   "/stk/index.html");
}); 
  

И это в моем index.html разметка

  <div style="width:200px; height:200px; overflow: hidden;">
    <img src="img/img1.jpg" alt="image1">
     </div>   
     <a href="index2.html">index2</a>
  

Я не могу загрузить img1.jpg на моей HTML-странице. Я также не могу перейти к index2.html.
Как ни странно, если я помещу папку img и index2.html на верхнем уровне, а также в папке stk, только тогда я могу загрузить img1.jpg в моем index.html и перейдите к index2.html. Это означает, что я должен поместить эти файлы в два места (верхний уровень, а также в папку stk).
Я пытался

 app.use(express.static('stk'));
  

и это

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

но, похоже, ничего не работает.

Ответ №1:

Вы создаете два разных маршрута для stk. Вы можете создать только один.

 const express = require('express');
const app = express();
const http = require("http");
const https = require("https");
const fs = require("fs");
const privateKey = fs.readFileSync("/etc/letsencrypt/live/xxxxxxxxx/privkey.pem","utf8");
  var certificate = fs.readFileSync("/etc/letsencrypt/live/xxxxxxxxx/fullchain.pem","utf8");
const credentials = { key: privateKey, cert: certificate };
  var server = https.createServer(credentials, app);


app.use(express.static('stk'));

// now you should be able to call;
// localhost:8080/img/img1.png
// localhost:8080/img/img2.png
// localhost:8080/index.html

server.listen(8080);
  

В вашем html хорошо вызывать ваши активы с /

 <img src="/img/img1.jpg" alt="image1">
<a href="/index2.html">index2</a>
  

Комментарии:

1. Я попытался, как вы сказали, удалив <app.get(«/», function (req, res) { res.sendFile(__dirname «/stk/index.html «); }); > но, к сожалению, это все еще не работает (: .

2. @Zeni итак, если вы откроете localhost:8080/img / img2.png, что произойдет?

3. Файлы находятся на безголовом сервере ubuntu в AWS ec2. Но если я открою myurl.com/img/img1.jpg , я получаю 404.

Ответ №2:

Пожалуйста, используйте это следующим образом, это должно решить вашу проблему. Перед этим скажите, что npm устанавливает ejs —save

 var path = require('path');

//set up view engine 
app.set('views', path.join(__dirname, 'stk'));
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');

app.use(express.static(path.join(__dirname, 'stk')));

app.get('/index', function(req, res){
    res.render('index.html');
});
  

и в index.html пожалуйста, используйте это таким образом:

 <div style="width:200px; height:200px; overflow: hidden;">
   <img src="/img/img1.jpg" alt="image1">
</div>
  

Комментарии:

1. Хотя я думаю, что path.join и » » дают те же результаты, но я безуспешно пробовал ваш метод l.

2. @Zeni Хорошо, я отредактировал свой код, пожалуйста, попробуйте. Работает с моей стороны.

3. @Zeni Первым делом, зени, я думаю, ты тогда не поняла концепцию относительного пути. Когда вы помещаете файлы в папку stk и загружаете индексный файл, который уже есть в stk, программа узнает, что вы ищете img / img.png, который должен быть только в stk, и поэтому загружает его. вы храните файлы в любом месте структуры, суть в том, что вы должны правильно указывать путь к нему.

4. amp; кстати, ваш код также работает, задавая вопросы, вы должны указывать код, который не работает, на правильном языке. В вопросе есть такая двусмысленность. Это вводит людей в заблуждение.

Ответ №3:

Наконец-то я смог решить проблему. @hurricane направил меня в правильном направлении, действительно, это была проблема маршрутизации, но только в настройках nginx. У меня более одного веб-сайта на одном сервере, и проблема была с директивой «server_name». После исправления все теперь работает так, как ожидалось. @Tejas Bramhecha Я опубликовал простейший возможный код, и я сказал «У меня это не работает». Это означает, что я знаю, что это очень простой код, но я хотел бы получить некоторые указания, в чем еще может быть проблема. К счастью, @hurricane направил меня в правильном направлении. Если вы не можете понять этот простой язык и настолько запутались в вопросе, что начали отказываться от голосования, я ничего не могу с этим поделать, кроме как почувствовать и извиниться перед вами :).