在Hapi.js中“挂载”(运行)遗留的http处理程序

时间:2014-07-20 00:45:16

标签: node.js http hapijs

我做了一个Node.js聚会演示,但无法回答这个问题。它仍然困扰着我。

假设我有一个遗留的http应用程序或Express.js应用程序。它是一种形式的函数

function legacy_app(request, response) {
  // Handle the request.
}

假设我为我的应用程序的新版本采用Hapi.js。但是我有许多调试的遗留代码或上游代码,我希望将它们集成到Hapi应用程序中。例如,旧版vhost将运行旧版本,或者可以在URL中的/legacy命名空间内访问。

这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

包装现有的HTTP节点服务器调度函数以用作hapi处理程序可能没问题,但您必须添加到hapi_wrap函数(最后):

reply.close(false);

这样hapi就可以完成处理请求而不会弄乱你的遗留逻辑(https://github.com/spumko/hapi/blob/master/docs/Reference.md#replycloseoptions)。

包装Express处理程序/中间件要复杂得多,因为您可能依赖于其他一些中间件(例如正文解析器,cookie解析,会话等)并使用一些不属于节点的Express装饰器(例如res .send(),res.json()等。)。

答案 1 :(得分:0)

我能想到的唯一方法就是手动。只需直接破解文档中的建议:拉出原始请求和响应对象,并将它们传递给旧处理程序。

// An application built with http core.
var http = require('http')
var legacy_server = http.createServer(legacy_handler)
function legacy_handler(request, response) {
  response.end('I am a standard handler\n')
}

// An express application.
var express = require('express')
var express_app = express()
express_app.get('*', function(request, response) {
  response.send('I am an Express app\n')
})

// A Hapi application.
var Hapi = require('hapi')
var server = new Hapi.Server(8080, "0.0.0.0")
server.route({path:'/', method:'*', handler:hapi_handler})
function hapi_handler(request, reply) {
  reply('I am a Hapi handler\n')
}

// Okay, great. Now suppose I want to hook the legacy application into the
// newer Hapi application, for example under a vhost or a /deprecated namespace.
server.route({path:'/legacy', method:'*', handler:hapi_wrap(legacy_handler)})
server.route({path:'/express', method:'*', handler:hapi_wrap(express_app)})

// Convert a legacy http handler into a Hapi handler.
function hapi_wrap(handler) {
  return hapi_handler
  function hapi_handler(request, reply) {
    var req = request.raw.req
    var res = request.raw.res

    reply.close(false)
    handler(req, res)
  }
}

legacy_server.listen(8081)
express_app.listen(8082)
server.start()

这似乎有效,但我很乐意,如果有人知道Hapi可以确认它没有错误。

$ # Hit the Hapi application
$ curl localhost:8080/
I am a Hapi handler

$ # Hit the http application
$ curl localhost:8081/
I am a standard handler

$ # Hit the Express application
$ curl localhost:8082/
I am an Express app

$ # Hit the http application hosted by Hapi
$ curl localhost:8080/legacy
I am a standard handler

$ # Hit the Express application hosted by Hapi
$ curl localhost:8080/express
I am an Express app