Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从节点内部内部调用快速路由_Javascript_Node.js_Http_Express_Routing - Fatal编程技术网

Javascript 从节点内部内部调用快速路由

Javascript 从节点内部内部调用快速路由,javascript,node.js,http,express,routing,Javascript,Node.js,Http,Express,Routing,我的API有一个ExpressJS路由,我想在NodeJS中调用它 var api = require('./routes/api') app.use('/api', api); 在我的/routes/api.js文件中 var express = require('express'); var router = express.Router(); router.use('/update', require('./update')); module.exports = router; 因

我的API有一个ExpressJS路由,我想在NodeJS中调用它

var api = require('./routes/api')
app.use('/api', api);
在我的/routes/api.js文件中

var express = require('express');
var router = express.Router();
router.use('/update', require('./update'));  
module.exports = router;
因此,如果我想从前端调用
/api/update/something/:withParam
,那么我需要从NodeJS脚本的另一个方面调用它,而无需在第二个位置重新定义整个函数

我已经尝试从内部使用HTTP模块,但我只是得到了一个“ECONNREFUSED”错误


我理解Express背后的想法是创建路由,但我如何在内部称它们为

处理这一问题的“常规”或“正确”方法是让您想要调用的函数自行中断,与任何路由定义分离。也许在它自己的模块中,但不一定。那就在你需要的地方打电话吧。像这样:

function updateSomething(thing) {
    return myDb.save(thing);
}

// elsewhere:
router.put('/api/update/something/:withParam', function(req, res) {
    updateSomething(req.params.withParam)
    .then(function() { res.send(200, 'ok'); });
});

// another place:
function someOtherFunction() {
    // other code...
    updateSomething(...);
    // ..
}

这是在Express 4中执行内部重定向的一种简单方法:

magic可以做的功能是:app.\u router.handle()

测试:我们向主页“/”发出请求,并将其重定向到其他路径“/other/path”


我已经为此制作了一个专用中间件:

req
中可用,它允许您
req.uest
另一条路由(来自给定路由)

它将原始cookie转发给后续请求,并在请求之间保持
req.session
同步,例如:

app.post('/login', async (req, res, next) => {
  const {username, password} = req.body

  const {body: session} = await req.uest({
    method: 'POST',
    url: '/api/sessions',
    body: {username, password}
  }).catch(next)

  console.log(`Welcome back ${session.user.firstname}!`

  res.redirect('/profile')
})
它支持承诺、等待和错误优先回调


有关更多详细信息,请参见

为什么要那样攻击服务器?为什么你不愿意只在那里做同样的操作呢?因为我不想重复@ian的一个可能重复的函数这是在那个问题5天前被问到的:)是的,在做了更多的挖掘之后,我意识到这可能是唯一的方法。我不确定Express是否有内置的“呼叫您自己的路线”功能。ThanksI get
TypeError:无法读取未定义的属性“句柄”
var app = express()

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

function home(req, res, next) {
  req.url = '/other/path'
  /* Uncomment the next line if you want to change the method */
  // req.method = 'POST'
  return app._router.handle(req, res, next)
}

app.get('/other/path', otherPath)
app.get('/', home)
app.post('/login', async (req, res, next) => {
  const {username, password} = req.body

  const {body: session} = await req.uest({
    method: 'POST',
    url: '/api/sessions',
    body: {username, password}
  }).catch(next)

  console.log(`Welcome back ${session.user.firstname}!`

  res.redirect('/profile')
})