添加到nodejs服务器的新路径

时间:2016-07-07 03:39:31

标签: node.js http server

我创建了以下nodejs服务器:

var http = require('http');

var serverFunction = function(req, res) {
    if (req.url === '/') {
        //does something
    }
}

http.createServer(serverFunction).listen(3000);

现在我想添加另一个路径(例如:/ hello),但我不想更改serverFunction。

我该怎么做?

3 个答案:

答案 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}/`);
});