web-dev-qa-db-ja.com

別のルートからのルート内でのGETメソッドのエクスプレスコール

複数のルートがあります。グループのルートのGETメソッド内で呼び出すことにより、ユーザーのルート(GETメソッド)からデータを取得するにはどうすればよいですか?これを行う最善の方法は何ですか?

私のapp.jsは次のようになります。

var express = require('express');

var routes = require('./routes/index');
var users = require('./routes/users');
var groups = require('./routes/groups');

var app = express();

app.use('/', routes);
app.use('/users', users);
app.use('/groups', groups);

module.exports = app;
app.listen(3000);

次に、別のファイルroutes/users.jsがあります。

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('GET ON THE users!');
});

module.exports = router;

そして別のルートroutes/groups.js:

var express = require('express');
var router = express.Router();
var otherRouter = require('./users')

/* GET groups listing. */
router.get('/', function(req, res, next) {

    // call the get on users and retrieve all data from that request

    res.send('GET for the groups');
});

module.exports = router;

ありがとうございました! :)

11
asuciu

そのためにルーティングを使用しないでください。 GETグループルートからユーザーを取得する機能を呼び出すだけで、そのデータで必要な処理を実行できます。 httpを呼び出す必要があるため、提案する方法ははるかに高価です。

簡単にするために、ロジックは同期的であり、データはdata/users.jsに保存されていると仮定しています。

var data = [{id:1, name: "one"},{id: 2, name: "two"}];
module.exports = function(){
  return data;
};

routes/users.jsで:

var express = require('express');
var router = express.Router();
var getUsers = required('./../data/users');

router.get('/', function(req, res, next) {
  res.send(getUsers());
});

routes/groups.jsで:

var express = require('express');
var router = express.Router();
var otherRouter = require('./users')
var getUsers = require('./.../data/users');

router.get('/', function(req, res, next) {
  var users = getUsers();
  //do some logic to get groups based on users variable value
  res.send('GET for the groups');
});
15
Slawomir Pasko

「転送」と説明されていたものを検討します。これは非常に便利で、他のフレームワーク、他の言語で利用できます。

さらに、「フォワード」としてnotは後続のHTTP応答からのオーバーヘッドを持ちます。

Expressの場合、バージョン4.Xでは以下が利用可能です。おそらく他のバージョンですが、私はチェックしていません。

var app = express()

function myRoute(req, res, next) {
  return res.send('ok')
}

function home(req, res, next) {
   req.url = '/some/other/path'

   // below is the code to handle the "forward".
   // if we want to change the method: req.method = 'POST'        
   return app._router.handle(req, res, next)
}

app.get('/some/other/path', myRoute)
app.get('/', home)
11
conrad10781

そのためにrun-middlewareモジュールを使用できます

app.runMiddleware('/pathForRoute',{method:'post'},function(responseCode,body,headers){
     // Your code here
})

詳細:

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

グーグルからここに来る人のために。 1つ以上のルートをヒットし、httpリクエストをスキップする必要がある場合supertest も使用できます。

const request = require("supertest");

app.get("/usersAndGroups", async function(req, res) {
    const client = request(req.app);
    const users = await client.get("/users");
    const groups = await client.get("/groups");

    res.json({
        users: users.body,
        groups: groups.body
    });
});

Promise.all で同時に実行することもできます

1
Stavros