2

私は Node.js ミートアップ プレゼンテーションを行いましたが、この質問に答えることができませんでした。それはまだ私を悩ませています。

従来の http アプリケーションまたは Express.js アプリケーションがあるとします。これは、次の形式の関数です。

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

アプリケーションの新しいバージョンに Hapi.js を採用するとします。しかし、Hapi アプリケーションに統合したいデバッグ済みのレガシー コードまたはアップストリーム コードがたくさんあります。たとえば、レガシー vhost はレガシー バージョンを実行するか/legacy、URL の名前空間内でアクセスできます。

これを行う最善の方法は何ですか?

4

2 に答える 2

1

ハピ ハンドラーとして使用するために既存の HTTP ノード サーバー ディスパッチ関数をラップすることはおそらく問題ありませんが、hapi_wrap 関数に (最後に) 追加する必要があります。

reply.close(false);

これにより、従来のロジックをいじることなく、hapi がリクエストの処理を終了できるようになります ( https://github.com/spumko/hapi/blob/master/docs/Reference.md#replycloseoptions )。

Express ハンドラー/ミドルウェアのラッピングは、おそらく他のミドルウェア (ボディパーサー、Cookie 解析、セッションなど) に依存し、ノードの一部ではない Express デコレーターの一部 (res.send( など) を使用しているため、はるかに複雑です。 )、res.json() など)。

于 2014-07-20T01:27:50.167 に答える
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()

これは機能しているようですが、ハピをよく知っている誰かがバグがないことを確認していただければ幸いです。

$ # 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
于 2014-07-20T00:51:28.847 に答える