#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 направил меня в правильном направлении. Если вы не можете понять этот простой язык и настолько запутались в вопросе, что начали отказываться от голосования, я ничего не могу с этим поделать, кроме как почувствовать и извиниться перед вами :).