2016-09-04 1 views
0

尋ねるのもう一つの方法は次のとおりです。あなたは、通常のhttpサーバとのexpress.Routerのインスタンスを使用することはできますか?エクスプレスアプリケーションの外でexpress.Routerを使用できますか?

const router = require('express').Router(); 
router.get("/", (req, res) => console.log("Routing...")); 
require("http").createServer((req, res) => { /* how to use router here?*/ }).listen(3000); 

ルータは、それが明示アプリの外でルータを使用して対処しないExpress.jsのドキュメントでどこにも、基本的なHTTPサーバとそれを接続しないための「エントリーポイント」を持っていないようですし、例えば:私は、ルータが実際にが原因.listen()方法の欠如の明示フレームワークなしに使用することはできません意味するthe comment to this SO questionを解釈します。

私はAPIのルーティングを必要とするノードモジュールを書いていますので、私が尋ねると、それはサーバーの任意の型に落下させるために、私は自由をしたいと思います。 Expressは、私が見ているルーティングソリューションのほんの一例です。

+1

ルータは、Expressミドルウェアとして呼ばれることを期待しています。これは、Expressにルータを接続する方法です。プレーンなhttpサーバで明示的にミドルウェアをシミュレートすることは可能かもしれませんが、率直に言って、Expressが既にコードを書いているときに、なぜそうするのか本当に理解できません。既存のWebサーバー用のエクスプローラーハンドラーをインスタンス化して、それにルーターをフックすることもできます。それもあなたの状況で動作する可能性があります。 – jfriend00

+0

@ jfriend00私が書いているモジュールは、私のWebサーバー専用のものではありません。それはミドルウェアですが、他の実装者の厳格な設定については何も仮定したくないので、私はそれを排他的なミドルウェアにしたくありません。私はexpressについて明確に尋ねています.Routterはルーティングの非常にクリーンな実装であり、私が最もよく知っているものですが、Expressの外で使用することができない場合は、ニーズ。 – TheKingOfTyrants

+0

実験をする必要があります。エクスプレスミドルウェアと同じ呼び出し規約をシミュレートし、それを使用してエクスプレスルータに呼び出すことができるかどうかを確認する、プレーンなhttpサーバーのハンドラを作成します。エクスプレスルータが依存している 'req'や' res'にいくつかのプロパティ/メソッドがあるかもしれませんが、これを理解する唯一の方法は、それを試して問題がどこにあるか見ることです。また、エクスプレスルータのコードも調べることができますが、実際のミドルウェアコールを踏むだけではなく、通常ははるかに複雑です。 – jfriend00

答えて

0

あなたはまだ他のルータによって処理されていないルートのルーティングを可能にしながら、プレーンの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に渡されるreqresオブジェクトは(Expressで追加のメソッドを追加した)reqresの予想強化Expressバージョンではありませんので、問題がありました。これは問題を引き起こす可能性が高いようでした。そのことを安全に回避するには、リバースエンジニアリングして、Expressアプリケーションオブジェクトコードの束を複製する必要があります。実際には、既存のappオブジェクトを使用して、それを正常にすることができたときに、実際にすべてを複製する理由は見当たらなかったので、そうするのが最善だと思いました。また、ExpressまたはExpressルータの使用は、独自のAPIモジュールの内部に完全に組み込まれており、外界には見えないので、既存のコードを使用することには問題ありません。

関連する問題