Хотя я не нашел идиоматического кода для Express.js + маршрутизирующих контроллеров , положитесь на эту подсказку в обсуждениях на GitHub, предполагаю, что это будет так:
import HTTPS from "https";
import Path from "path";
import BodyParser from "body-parser";
import createExpressApplication from "express";
import type { Express as ExpressApplication } from "express";
import { useExpressServer as supportClassSyntax } from "routing-controllers";
const expressApplication: ExpressApplication = createExpressApplication().
// Use various plugins
use(BodyParser.json());
HTTPS.createServer(
{
key: FileSystem.readFileSync(
Path.join(process.cwd(), "ssl" "SSL_Key-FrontServer.LocalDevelopment.pem"), "utf8"
),
cert: FileSystem.readFileSync(
Path.join(process.cwd(), "ssl", "SSL_Certificate-FrontServer.LocalDevelopment.pem"), "utf8"
)
},
expressApplication
);
supportClassSyntax(
expressApplication,
{
controllers: [
// ...
]
}
).
listen(
443,
(): void => {
console.info("Server started")
}
);
Обратите внимание, что я подтвердил правильность путей к сертификату SSL и ключу SSL, потому что, если я намеренно укажу неправильный путь к сертификату SSL и/или ключу SSL, приложение завершится с ошибкой «Ошибка: ENOENT: нет такого файла или каталога». .
Если попытаться получить доступ к «https://localhost:443», в браузере возникнет ошибка «Сайт не может обеспечить безопасное соединение» (мой интерфейс имеет японский язык, поэтому я использовал боковой снимок экрана с тем же сообщением на английском языке). , а «domanin.com» на этом снимке экрана на самом деле в моем случае — «localhost:443»):
Однако http://localhost:443/ работает.
Что не так? Мне не нужен http, мне нужен https.
Функция useExpressServer из «контроллеров маршрутизации» (я назвал ее supportClassSyntax) возвращает экземпляр приложения Express, у которого есть метод listen. Никаких ошибок здесь быть не должно.
С помощью утилиты mkcert:
mkcert localhost 127.0.0.1
Насколько я понял, номер порта не имеет значения.
@Марк, ох, извини. Этот скриншот не мой, потому что у меня японский пользовательский интерфейс, который не читается большинством пользователей SO. Я открываю свое приложение в https://localhost:443.





Я считаю, что ваша основная проблема заключается в том, что вы звоните listen с сервера, возвращенного вашим псевдонимом useExpressServer, который не знает о вашем сертификате:
supportClassSyntax(
expressApplication,
{
controllers: [
// ...
]
}
).listen(443, (): void => { // <--- don't call listen here
console.info('server started')
})
Вместо этого вам следует вызвать прослушивание со своего https сервера, передавая useExpressServer только экспресс-приложение с любым настроенным промежуточным программным обеспечением.
import HTTPS from "https";
import Path from "path";
import BodyParser from "body-parser";
import createExpressApplication from "express";
import type { Express as ExpressApplication } from "express";
import { useExpressServer as supportClassSyntax } from "routing-controllers";
const expressApplication: ExpressApplication = createExpressApplication()
const httpsServer = HTTPS.createServer(
{
key: FileSystem.readFileSync(
Path.join(process.cwd(), "ssl" "SSL_Key-FrontServer.LocalDevelopment.pem"), "utf8"
),
cert: FileSystem.readFileSync(
Path.join(process.cwd(), "ssl", "SSL_Certificate-FrontServer.LocalDevelopment.pem"), "utf8"
)
},
expressApplication
);
expressApplication.use(BodyParser.json());
supportClassSyntax(
expressApplication,
{
controllers: [
// ...
]
}
)
// Now call listen from your HTTPS server with the configured certificate
httpsServer.listen(443, () => {
console.info("server started")
});
Спасибо за ответ! Вы совершенно правы. Примите, проголосуйте и получите приз.
В вашем браузере полное доменное имя — «domain.com». Почему вы не включили его в команду
mkcert? Вам нужен действительный сертификат для этого домена. Также:mkcertне создает полную доверенную цепочку, поскольку выдаваемые сертификаты являются самоподписанными.