Смешайте http.Server и express приложение - PullRequest
0 голосов
/ 03 марта 2020

У меня есть существующий модуль, который создает простой http сервер . Он может либо запустить сервер и прослушивать порт, либо открыть сервер без его запуска.

Я хотел бы расширить некоторые маршруты, но с помощью express без использования двух портов.
Это возможно?

const http = require('http')
const express = require('express')

const app = express()

app.get('/bar', (req, res) => {
  res.json({msg: 'fox'})
})

const server = http.createServer((req, res) => {
  if (req.url === '/foo') {
    res.writeHead(200, {'Content-Type': 'text/html'})
    res.end()
  }
})

// TODO: how to merge app and server?

const merged = howToMerge(server, app)
merged.listen(5000)

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Чтобы подключить Express к простому http-серверу, который уже создан, вам просто нужно зарегистрировать переменную app для события request следующим образом:

server.on('request', app);

Это именно то, что Передача обратного вызова на http.createServer() делает для вас.


И вот рабочее приложение, которое создает http-сервер отдельно:

const http = require('http');
const app = require('express')();

const server = http.createServer((req, res) => {
  if (req.url === '/foo') {
    console.log("plain handler", req.url);
    res.writeHead(200, {'Content-Type': 'text/plain'})
    res.end("foo");
  }
});

app.get("/demo", (req, res) => {
    console.log("expess handler", req.url);
    res.send("demo");
});

app.use((err, req, res, next) => {
    // only handle error if someone hasn't already sent a response
    if (!res.headersSent) {
        res.status(404).send("Error 404");
    }
});

// register Express app as a handler for the request event
server.on('request', app);

server.listen(80);

Примечание: При использовании двух отдельных систем, таких как Это связано с некоторыми сложностями, поскольку оба обработчика события request (переданный createServer() и зарегистрированный server.on('request', ...) будут вызываться при каждом запросе http, даже если он уже обработан. потому что две системы не созданы для совместной работы таким образом. По сути, у вас есть два отдельных прослушивателя событий, пытающихся обработать каждый запрос. Возможно, вам придется иногда проверять res.headersSent, чтобы увидеть, обработала ли другая уже запрос или нет.


Если вы хотите заглянуть внутрь работы node.js, вы можете увидеть, что http.createServer() это именно этот код :

function createServer(opts, requestListener) {
  return new Server(opts, requestListener);
}

И объект Server является подклассом Net .server, а конструктор содержит этот код :

if (requestListener) {
  this.on('request', requestListener);
}
0 голосов
/ 03 марта 2020

как то так

const http = require('http')
const express = require('express')

const app = express()

app.use(function (req, res, next) {
  if (req.url === '/foo') {
    res.writeHead(200, { 'Content-Type': 'text/html' })
    res.end()
  } else {
    next()
  }
})

app.get('/bar', (req, res) => {
  res.json({ msg: 'fox' })
})

const server = http.createServer(app)
server.listen(5000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...