我创建了以下nodejs服务器:
var http = require('http');
var serverFunction = function(req, res) {
if (req.url === '/') {
//does something
}
}
http.createServer(serverFunction).listen(3000);
现在我想添加另一个路径(例如:/ hello),但我不想更改serverFunction。
我该怎么做?
答案 0 :(得分:2)
创建多个独立请求处理程序的更高级别方法是使用a simple framework like Express
。虽然从技术上讲不需要做任何你想要的事情,但Express可以让这样的任务变得容易。
具有多个路由处理程序的简单快速服务器如下所示:
var express = require('express');
var app = express();
app.get('/', function(req, res) {
// handle the / route here
});
app.get('/hello', function(req, res) {
// handle the /hello route here
});
app.listen(3000);
Express框架的构建允许您添加路由,如上所示。它还包括许多更多功能,如中间件处理和访问许多预先构建的中间件模块,如cookie处理,会话处理,后期处理等......
严格回答您的原始问题(虽然我不认为这是添加更多路由处理程序的最简单方法),如果您想使用普通的http模块而不是将第二条路由添加到现有的侦听器,可以监听服务器上的request
event。
var http = require('http');
var serverFunction = function(req, res) {
if (req.url === '/') {
//does something
}
}
var server = http.createServer(serverFunction).listen(3000);
server.on('request', function(req, res) {
// see all incoming requests here
if (req.url === '/hello') {
// process /hello route here
}
});
事实上,如果您阅读http server doc carefully,您会发现serverFunction
只不过是request
事件的自动注册监听器,而且与事件样式接口一样,如果您愿意,可以为该事件创建更多的监听器。
答案 1 :(得分:0)
假设您要使用低级NodeJS HTTP API。您可以使用函数组合将多个处理程序组合成一个处理程序。如果req.url
没有匹配,则每个处理程序都应该执行下一个处理程序。
var http = require('http');
var handler1 = function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write('/');
res.end();
}
var handler2 = function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write('/Hello');
res.end();
}
var middleware = compose([wrapHandler('/', handler1),
wrapHandler('/hello', handler2)]);
http.createServer(middleware).listen(3000);
function wrapHandler(path, cb) {
return function (req, res, next) {
if (req.url === path) {
cb(req, res);
} else {
next();
}
};
}
function notFoundHandler(req, res) {
res.writeHead(404, { 'Content-Type': 'text/html' });
res.write('No Path found');
res.end();
};
// adapted from koa-compose
function compose(middleware) {
return function (req, res){
let next = function () {
notFoundHandler.call(this, req, res);
};
let i = middleware.length;
while (i--) {
let thisMiddleware = middleware[i];
let nextMiddleware = next;
next = function () {
thisMiddleware.call(this, req, res, nextMiddleware);
}
}
return next();
}
}
答案 2 :(得分:0)
其他单一解决方案
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const endpoints = {
'^/hello$': (req, res) => {
return "Hello World";
},
'^/hello/([^/]+)$': (req, res, m) => {
return `Hello ${m[1]}`;
}
};
const server = http.createServer((req, res) => {
console.log(`Request ${req.url}`);
let match = null;
const handler = (Object.entries(endpoints)
.find(([ k, _ ]) => ((match = (new RegExp(k)).exec(req.url)) !== null)) || []) [1]
if(handler) {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/json');
res.end(handler(req, res, match));
} else {
res.writeHead(404, { 'Content-Type': 'text/html' });
res.end();
}
});
server.listen(port, hostname, () => {
console.log(`Server running in http://${hostname}:${port}/`);
});