Создание сервера 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" });

Если вы хотите знать, что происходит в приведенной выше строке:

  1. Метод прослушивания 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");
Другие вопросы по тегам