我做了一个Node.js聚会演示,但无法回答这个问题。它仍然困扰着我。
假设我有一个遗留的http应用程序或Express.js应用程序。它是一种形式的函数
function legacy_app(request, response) {
// Handle the request.
}
假设我为我的应用程序的新版本采用Hapi.js。但是我有许多调试的遗留代码或上游代码,我希望将它们集成到Hapi应用程序中。例如,旧版vhost将运行旧版本,或者可以在URL中的/legacy
命名空间内访问。
这样做的最佳方式是什么?
答案 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