从另一条路线在路线内快速调用 GET 方法
Express call GET method within route from another route
我有多条路线。如何通过在组路由的 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;
您不应该为此使用路由。只需调用负责从 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');
});
您完全可以使用 run-middleware
模块
app.runMiddleware('/pathForRoute',{method:'post'},function(responseCode,body,headers){
// Your code here
})
更多信息:
- Github & NPM 中的模块页面;
- Examples of use run-middleware module
披露:我是该模块的维护者和第一个开发者。
我考虑了正在解释的内容 "forwarding",它非常有用,并且在其他框架和其他语言中可用。
此外,作为 "forward",它 不会 有来自后续 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)
对于来自 google 的人。如果您需要点击一条或多条路线并跳过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
同时进行
我为此做了一个专门的中间件uest
, see my detailed answer here:
我有多条路线。如何通过在组路由的 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;
您不应该为此使用路由。只需调用负责从 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');
});
您完全可以使用 run-middleware
模块
app.runMiddleware('/pathForRoute',{method:'post'},function(responseCode,body,headers){
// Your code here
})
更多信息:
- Github & NPM 中的模块页面;
- Examples of use run-middleware module
披露:我是该模块的维护者和第一个开发者。
我考虑了正在解释的内容 "forwarding",它非常有用,并且在其他框架和其他语言中可用。
此外,作为 "forward",它 不会 有来自后续 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)
对于来自 google 的人。如果您需要点击一条或多条路线并跳过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
同时进行我为此做了一个专门的中间件uest
, see my detailed answer here: