2012-10-04 12 views
28

Expressでnode.jsにWebアプリケーションを作成しています。私は次のようなルートを定義しました:Express NodeJS内の他のルートに既に定義されているルートを呼び出す

app.get("/firstService/:query", function(req,res){ 
    //trivial example 
    var html = "<html><body></body></html>"; 
    res.end(html) 
}); 

どのように私は急行の中からそのルートを再利用しますか?

app.get("/secondService/:query", function(req,res){ 
    var data = app.call("/firstService/"+query); 
    //do something with the data 
    res.end(data); 
}); 

私はAPIドキュメントに何かを見つけることができませんでしたし、それがkludgeyようなので、むしろ「要求」のような別のライブラリを使用することはありません。私はできるだけモジュール化して私のアプリケーションを維持しようとしています。思考?

おかげ

答えて

13

あなたは単に、別の関数にこれを破る共有場所にそれを入れて、そこから行くことができますか?

var queryHandler = require('special_query_handler'); 
// contains a method called firstService(req, res); 

app.get('/firstService/:query', queryHandler.firstService); 

// second app 
app.get('/secondService/:query', queryHandler.secondService); 

正直なところ、app.get(...)の内部でコールバックをネストのこの全体のビジネスは本当に素晴らしい方法ではありません。すべてのコアコードを含む巨大なファイルになります。

app.get()app.post()ステートメントで満たされたファイルがあり、すべてのコールバックハンドラが異なる整理された別のファイルに収められています。

+1

ありがとうございました!私は、扱いにくくなっているプロジェクトを手掛けようとしているExpress初心者です。中級から上級のチュートリアル/ヘルプサイトの提案はありますか? – user1148710

21

ゲイツ氏によると同様ですが、私はfunction(req, res){}をあなたのルートファイルに残しています。だから私は、代わりにこのようなものだろう:

routes.js

var myModule = require('myModule'); 

app.get("/firstService/:query", function(req,res){ 
    var html = myModule.firstService(query); 
    res.end(html) 
}); 

app.get("/secondService/:query", function(req,res){ 
    var data = myModule.secondService(query); 
    res.end(data); 
}); 

をそしてあなたのモジュールであなたのロジックはそうのように分割している:

myModule.js

var MyModule = function() { 
    var firstService= function(queryParam) { 
     var html = "<html><body></body></html>"; 
     return html; 
    } 

    var secondService= function(queryParam) { 
     var data = firstService(queryParam); 
     // do something with the data 
     return data; 
    } 

    return { 
     firstService: firstService 
     ,secondService: secondService 
    } 
}(); 

module.exports = MyModule; 
0

run-middlewareモジュールを正確に使用できます

app.runMiddleware('/firstService/query',function(responseCode,body,headers){ 
    // Your code here 
}) 

さらに詳しい情報:

開示:私は、このモジュールのメンテナ&最初の開発者です。

+0

これはルータと一緒に使うことができますか?もしそうなら、私はそれをどのようにして表示するのでしょうか?ありがとう! – Shaun

+0

Morganは、実行ミドルウェアによって呼び出されたルートの誤った情報を示しています。任意のヘルプ@aminadav –

3

あなたのルート上のミドルウェアの多くを持っている場合は、あなたが広がるの恩恵を受けることができます。

const router = express.Router(); 

const myMiddleware = [ 
    authenticationMiddleware(), 
    validityCheckMiddleware(), 
    myActualRequestHandler 
]; 

router.get("/foo", ...myMiddleware); 
router.get("/v1/foo", ...myMiddleware); 
+1

http://expressjs.com/en/guide/routing.html例: 'app.get( '/ example/c'、[cb0、cb1、cb2])'、あなたはそうではないスプレッドオペレータが必要です。いずれにせよ、知ってよかった! @ryanm Huh。 – ryanm

+0

ナイスキャッチ! –

0

私は、次のように使用している:userpage.js product.jsで

router.createSitemap = function(req, res, callback) { code here callback(value); } 

で を

var userPageRouter = require('userpages'); 
userPageRouter.createSitemap(req, res, function() { 
          //console.log('sitemap'); 
         }); 

同じuserpage.jsルータでも使用できます。他のルーティングにも使用できますよく例えば。

router.get('/sitemap', function (req, res, next) { 
    router.createSitemap(req, res, function() { 
     res.redirect('/sitemap.xml'); 
    }); }); 

希望すると、これが役立ちます。

関連する問題