web-dev-qa-db-ja.com

Express NodeJSの他のルートで既に定義されているルートを呼び出す

Expressを使用してnode.jsでWebアプリを作成しています。ルートを次のように定義しました:

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

Express内からそのルートを再利用するにはどうすればよいですか?

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

APIドキュメントには何も見つからず、「リクエスト」のような別のライブラリを使用したくありません。アプリをできるだけモジュール化するようにしています。考え?

ありがとう

30
user1148710

これを別の関数に分解し、共有スポットに配置してそこから移動できますか?

_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()ステートメントで満たされたファイルで、すべてのコールバックハンドラーが、より適切に編成された異なるファイルに存在します。

14
Gates VP

ゲイツ氏の発言に似ていますが、ルートファイルにfunction(req, res){}を保持します。だから私は代わりにこのようなことをします:

routes.js

var myModule = require('myModule');

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

app.get("/secondService/:query", function(req,res){
    var data = myModule.secondService(req.params.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;
22
c0deNinja

ルート上に多くのミドルウェアがある場合は、次のように拡散することで利益を得ることができます。

const router = express.Router();

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

router.get( "/foo", ...myMiddleware );
router.get( "/v1/foo", ...myMiddleware );
3
Der Hochstapler

あなたはそのためにrun-middlewareモジュールを正確に使うことができます

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

より詳しい情報:

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

私は次の方法を使用しました:userpage.js

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

product.jsで

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');
    }); });

これがお役に立てば幸いです。

0
Dhiraj