By_Engine
@By_Engine

Почему Vite.createServer не дожидается асинхронного кода?

Задача реализовать нативный dev server для SSR.

Слушатель события не дожидается разрешения асинхронного кода и выводит Cannot GET / со статусом 404.
Если удалить асинхронный код и отправить просто строку, то все работает.
vite.config стандартный. Подключен только плагин для Vue

Bun v1.1.12
Vite v5.2.12

import { createServer } from 'vite'

const host = process.env.HOST || 'localhost'
const port = Number(process.env.PORT || 3000)

function asyncData(data, ms = 1000) {
  return new Promise(resolve => setTimeout(() => resolve(data), ms))
}

const server = await createServer({ appType: 'custom' })
await server.listen(port)


server.httpServer?.on('request', async (req, res) => {
  res.end(await asyncData('test'))
})
  • Вопрос задан
  • 307 просмотров
Решения вопроса 1
By_Engine
@By_Engine Автор вопроса
Решение:
В Vite v5 обработчик запросов должен создаваться как плагин в конфиге

// vite.config

function asyncData(data, ms = 1000) {
  return new Promise(resolve => setTimeout(() => resolve(data), ms))
}

export default {
  plugins: [
    {
        name: 'custom-middleware',
        configureServer(server) {
          server.middlewares.use(async (req, res, next) => {            
            if (req.url === '/') {
              res.statusCode = 200
              res.setHeader('Content-Type', 'text/plain')
              return res.end(await asyncData('asdad'))
            }
            return next()
          })
        }
      }
  ]
}


Запускаться сервер должен командой vite dev
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@historydev Куратор тега JavaScript
const host = process.env.HOST || 'localhost'
const port = Number(process.env.PORT || 3000)

function sendAsync(data, res, ms = 1000) {
  return setTimeout(() => res.end(data), ms);
}

const server = await createServer({ appType: 'custom' })
await server.listen(port)


server.httpServer?.on('request', async (req, res) => {
  sendAsync('test', res);
});
Ответ написан
Комментировать
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
У vite внутри есть собственный обработчик события request, который отвечает раньше Вашего.

Скорее всего Вам поможет вот это:
https://vitejs.dev/config/server-options.html#serv...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы