【问题标题】:Add new path to nodejs server将新路径添加到 nodejs 服务器
【发布时间】:2021-05-31 09:05:37
【问题描述】:

我已经创建了以下 nodejs 服务器:

var http = require('http');

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

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

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

我该怎么做?

【问题讨论】:

    标签: node.js http server


    【解决方案1】:

    创建多个独立请求处理程序的高级方法是使用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 事件的自动注册侦听器,并且与事件样式接口一样,您可以创建更多侦听器如果您愿意,可以参加该活动。

    【讨论】:

      【解决方案2】:

      假设您想使用低级 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();
          }
      }
      

      【讨论】:

        【解决方案3】:

        其他单一解决方案

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-22
          • 1970-01-01
          • 1970-01-01
          • 2011-11-27
          • 2018-01-19
          相关资源
          最近更新 更多