Создание сервера Deno https
Я ищу пример создания https-сервера в Deno. Я видел примеры HTTP-сервера Deno, но не https.
Я пробовал поиск в Google, но не нашел результатов
7 ответов
serveTLS
приземлился вместе с Deno 0.23.0:
Пример использования:
import { serveTLS } from "https://deno.land/std/http/server.ts";
const body = new TextEncoder().encode("Hello HTTPS");
const options = {
hostname: "localhost",
port: 443,
certFile: "./path/to/localhost.crt",
keyFile: "./path/to/localhost.key",
};
// Top-level await supported
for await (const req of serveTLS(options)) {
req.respond({ body });
}
С Deno 1.9+ вы можете использовать собственный сервер. Он предоставляет возможность использовать HTTPS и работает немного быстрее по сравнению с
std/http
.
Пример:
const server = Deno.listenTls({
port: 443,
certFile: "./my-ca-certificate.pem",
keyFile: "./my-key.pem"
});
for await (const conn of server) {
handle(conn);
}
async function handle(conn: Deno.Conn) {
const httpConn = Deno.serveHttp(conn);
for await (const requestEvent of httpConn) {
try {
const response = new Response("Hello World!");
await requestEvent.respondWith(response);
}
catch (error) {
console.error(error);
}
}
}
Теперь привязка TLS поддерживается Dano. Ниже приведены способы создания https-сервера:
import { serveTLS } from "https://deno.land/std/http/server.ts";
const body = new TextEncoder().encode("Hello HTTPS");
const options = {
hostname: "localhost",
port: 443,
certFile: "./path/to/localhost.crt",
keyFile: "./path/to/localhost.key",
};
for await (const req of serveTLS(options)) {
req.respond({ body });
}
serveTLS
Аргументыoptions: any
возврат: Сервер
С участием listenAndServeTLS
listenAndServeTLS(options, (req) => {
req.respond({ body });
});
listenAndServeTLS
Аргументы
options: any
handler: (req: ServerRequest) => void
возврат: любой
Как насчет использования рамки из дуба?
https://github.com/oakserver/oak
Я считаю, что это самый стабильный веб-фреймворк в Deno. И вы также получаете много информации из того, что хотите узнать об этом.
Прежде всего, можно создать HTTPS-сервер с библиотекой DENO std. Но в моем случае я использовал библиотеку OAK для своего приложения. Подробнее о дубовой библиотеке можно прочитать здесь . Шаг 1. Подготовьте файл сертификата и файл ключа (при условии, что они созданы для любого доменного имени, которое вам нравится. Это может быть просто localhost). Если вы не понимаете, что это значит, прочтите эту статью.. Шаг 2 Пришло время настроить параметры прослушивания вашего приложения. Опережая теорию и концепции, вы можете скопировать приведенную ниже строку кода и при необходимости изменить пути к параметрам certFile и keyFile.
await app.listen({ port: port, secure: true, certFile: "<path-to-file>/<file-name>.pem", keyFile: "<path-to-file>/<file-name>-key.pem" });
Если вы хотите знать, что происходит в приведенной выше строке:
- Метод прослушивания Oak Application принимает параметры, которые необходимо настроить, и эти параметры могут иметь тип ListenOptions, который может иметь один или оба типа ListenOptionsBase , ListenOptionsTls , унаследованные от Deno.ListenOptions и Deno.ListenTlsOptions соответственно. Если вы отметите Deno.ListenTlsOptions, есть два параметра: certFile и keyFile, которые принимают пути к вашему сертификату и ключ для сертификата соответственно, которые являются файлами .pem.
братан, я сталкиваюсь с некоторыми ситуациями, когда пишу следующий код:
/** @format */
const cert = Deno.readTextFileSync('./cert.pem')
const key = Deno.readTextFileSync('./private.pem')
const listener = Deno.listenTls({
cert,
key,
hostname: 'localhost',
port: 8080,
})
console.log('Server running on https://localhost:8080/')
for await (const conn of listener) {
handleConn(conn)
}
async function handleConn(conn: Deno.TlsConn) {
const httpConn = Deno.serveHttp(conn)
for await (const req of httpConn) {
const url = new URL(req.request.url)
if (url.pathname === '/favicon.ico') continue
const path = url.pathname === '/' ? '/welcome.html' : url.pathname
const ext = path.split('.').pop()
const file = (await Deno.open(`./http/example${path}`)).readable
let res: Response | null = null
switch (ext) {
case 'html' || 'css':
res = resBuilder(file, `text/${ext}`)
break
case 'js':
res = resBuilder(file, 'text/javascript')
break
case 'png' || 'jpg' || 'ico':
res = resBuilder(file, `image/${ext}`)
break
default:
res = resBuilder(file, '*/*')
}
req.respondWith(res!)
}
}
function resBuilder(data: ReadableStream<Uint8Array>, contentType: string) {
return new Response(data, {
headers: new Headers({ 'content-type': contentType }),
})
}
Когда я открыл его в браузере, произошла ошибка:
error: Uncaught (in promise) Http: error writing a body to connection: tls handshake eof: tls handshake eof
for await (const req of httpConn) {
^
at async HttpConn.nextRequest (ext:deno_http/01_http.js:101:21)
at async Object.next (ext:deno_http/01_http.js:184:24)
at async handleConn (file:///Users/feiwu/Project/node/coding_and_nas/http/example/http.ts:24:20)
Вы проверили DENO ABC? Это лучший фреймворк для создания веб-приложений. Подробнее читайте на https://deno.land/x/abc/README.md.
import { abc } from "https://deno.sh/abc/mod.ts";
const app = abc();
app
.get("/hello", c => {
return "Hello, Abc!";
})
.start("0.0.0.0:8080");