あなたはまだ他のルータによって処理されていないルートのルーティングを可能にしながら、プレーンのNode.js HTTPサーバーにExpressルータをフックすることができます。ただし、Expressアプリケーションを作成してそのオブジェクトを使用する必要がありますが、ExpressオブジェクトはWebサーバーを引き継ぐ必要はなく、あなたのルートにのみ使用できます。ここではそれがうまくいく方法は次のとおりです。
コードは、あなたのAPIの利用者のために:
// generic node.js http server created by the user of your API
const http = require('http');
const server = http.createServer(function(request, response) {
// the user of your API has to insert a handler here
// that gives your API a first crack at handling the http request
libRouter(request, response, function() {
// if this callback is called, then your API did not handle the request
// so the owner of the web server can handle it
});
});
server.listen(80);
あなたのAPIコードは:
// you create your desired Express router
const express = require('express');
const router = express.Router();
// define the handlers for your router in the usual express router fashion
router.get("/test", function(req, res) {
res.send("Custom API handled this request");
});
// your create an Express instance
const app = express();
// hook your router into the Express instance in the normal way
app.use("/api", router);
// define a handler function that lets the express instance
// take a crack at handling an existing http request without taking over the server
function apiHandler(req, res, done) {
// call app.handle() to let the Express instance see the request
return app.handle(res, res, done);
}
このように、あなたのエクスプレスの利用、エクスプレスルータが完全ですあなたのコードの内部。既存のnode.js httpサーバーが適切な引数を使用して関数apiHandler(req, res, doneFn)
を呼び出すだけです。 done
コールバックはAPIが要求を処理しなかった場合にのみ呼び出され、その場合はAPIのユーザーがリクエストを処理する必要があります。
この例では、/api/test
のルートを定義し、必要な数だけ/api/xxx
ルートを定義できます。 app
オブジェクト上に複数のルータを使用して、それぞれ異なるプレフィックスパスを使用することもでき、すべてのルータをチェックします。
記録のために、Expressアプリケーションオブジェクトのないルータのみを使用してみました。私は一種のそれが動作するようになったが、router
に渡されるreq
とres
オブジェクトは(Expressで追加のメソッドを追加した)req
とres
の予想強化Expressバージョンではありませんので、問題がありました。これは問題を引き起こす可能性が高いようでした。そのことを安全に回避するには、リバースエンジニアリングして、Expressアプリケーションオブジェクトコードの束を複製する必要があります。実際には、既存のapp
オブジェクトを使用して、それを正常にすることができたときに、実際にすべてを複製する理由は見当たらなかったので、そうするのが最善だと思いました。また、ExpressまたはExpressルータの使用は、独自のAPIモジュールの内部に完全に組み込まれており、外界には見えないので、既存のコードを使用することには問題ありません。
ルータは、Expressミドルウェアとして呼ばれることを期待しています。これは、Expressにルータを接続する方法です。プレーンなhttpサーバで明示的にミドルウェアをシミュレートすることは可能かもしれませんが、率直に言って、Expressが既にコードを書いているときに、なぜそうするのか本当に理解できません。既存のWebサーバー用のエクスプローラーハンドラーをインスタンス化して、それにルーターをフックすることもできます。それもあなたの状況で動作する可能性があります。 – jfriend00
@ jfriend00私が書いているモジュールは、私のWebサーバー専用のものではありません。それはミドルウェアですが、他の実装者の厳格な設定については何も仮定したくないので、私はそれを排他的なミドルウェアにしたくありません。私はexpressについて明確に尋ねています.Routterはルーティングの非常にクリーンな実装であり、私が最もよく知っているものですが、Expressの外で使用することができない場合は、ニーズ。 – TheKingOfTyrants
実験をする必要があります。エクスプレスミドルウェアと同じ呼び出し規約をシミュレートし、それを使用してエクスプレスルータに呼び出すことができるかどうかを確認する、プレーンなhttpサーバーのハンドラを作成します。エクスプレスルータが依存している 'req'や' res'にいくつかのプロパティ/メソッドがあるかもしれませんが、これを理解する唯一の方法は、それを試して問題がどこにあるか見ることです。また、エクスプレスルータのコードも調べることができますが、実際のミドルウェアコールを踏むだけではなく、通常ははるかに複雑です。 – jfriend00