Почему браузер не может получить доступ к корневому пути сайта, получая сообщение «Cannot GET /»?

Я нашел следующий код: 
```javascript
const https = require('https');
const express = require('express');
const app = express();
const fs = require('fs');
const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());

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

app.post("/mssg", function (req, res){
    console.log(req.body);
    res.redirect('/');
});

const options = {
    key: fs.readFileSync('server.key'),
    cert: fs.readFileSync('server.pem'),
};

https.createServer(options, app).listen(3000, function (req, res) {
    console.log("port 3000");
});
```

Я взял его из статьи и решил протестировать. Однако, когда я открываю страницу в браузере, он выдает ошибку о том, что HTTPS не защищен (хотя и допускает доступ к странице), и я вижу сообщение "Cannot GET /". Не могу понять, почему доступ к корневому маршруту отсутствует. Я только начинаю изучать эту тему, поэтому прошу прощения, если задаю глупый вопрос. Также, если не трудно, подскажите, как подписывать SSL сертификаты?
  • 11 ноября 2024 г. 13:03
Ответы на вопрос 2
Ошибка "Cannot GET /" возникает из-за неправильного использования метода `res.sendFile`. В вашем коде вы передаете параметры в неправильном порядке. Метод `sendFile` принимает путь к файлу как первый аргумент и опции как второй аргумент (или просто объект опций, если они нужны), но в вашем случае вы передаете `__dirname` как первый аргумент и `'/index.html'` как второй, что неправильно.

Вам нужно использовать `path.join`, чтобы правильно сформировать путь к файлу. Вот исправленный обработчик:

```javascript
const path = require('path');

// ... ваш код

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

// ... остальной ваш код
```

Теперь браузер должен корректно находить и загружать файл `index.html`, если он находится в одной папке с вашим серверным кодом.

Что касается предупреждения о том, что HTTPS не защищен, это может быть связано с тем, что вы используете самоподписанный сертификат. Браузеры не доверяют этим сертификатам по умолчанию. Чтобы обойти это во время разработки, вы можете добавить исключение в браузере, но для производственной среды вам потребуется использовать сертификационный центр (CA), чтобы получить действительный сертификат. 

Если вы хотите подписать свой собственный сертификат для разработки, вы можете сделать это с помощью OpenSSL с использованием команды:

```bash
openssl req -nodes -new -x509 -keyout server.key -out server.pem
```

Эта команда создаст самоподписанный сертификат, когда вы ответите на вопросы, которые будут заданы в терминале. Сертификат будет действовать только для тестирования и разработки. Для настоящего использования вам нужно будет получить сертификат от доверенного CA, что обычно делается через использование таких провайдеров, как Let's Encrypt, Comodo или других.

Надеюсь, это поможет вам решить ваши проблемы! Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать.
Вам надо указать папку со статическими файлами ( документация ): 
...
app.use(express.static(__dirname)) // вот эту строчку добавьте
app.use(bodyParser.urlencoded({ extended: false }));
...


Если вам локально надо подписать сертификаты, то в терминале ( habr ):
openssl genrsa -out localhost-key.pem 2048

openssl req -new -x509 -sha256 -key localhost-key.pem -out localhost.pem -days 365
Похожие вопросы