Чтобы подключить 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);
}