在我的快速应用程序中,我用routes.ts实现了路由:
var Router = express.Router();
Router.route('/models/:modelId')
.get(function (req, res) {
service.setParameter(req)
service.get(req,res)
});
Router.route('/models/:modelId')
.post(function (req, res) {
service.setParameter(req)
service.post(req,res)
});
和express.ts:
export const App = express()
App.use(express.json())
App.use(express.urlencoded({ extended: true }))
App.use(helmet())
App.use('/', Router)
在每个路由器呼叫时,我想执行一段代码service.setParameter(req),它从“params”中获取特定的参数,但是我不想显式地添加到每个路由器方法中。
在路由器之前和之后,我尝试将其作为中间件添加
App.use('/', Router)
App.use(function(req, res, next){
service.setParameter(req)
next()
})
但是,如果我在路由器之前定义了它,那么路由还没有被设置,并且我没有得到我想要的参数,如果我在之后定义它,那么中间件就不会被执行。
如何以通用方式执行service.setParameter(req),以便将其应用于所有路由?
发布于 2022-01-15 02:36:13
在express.ts
文件中,您可以添加一个中间件,它可以在挂载路由器之前完成,然后使用next()
进行处理。你可以这样做:
App.use('/*', (req, res, next) => {
service.setParameter(req);
next();
});
App.use('/', Router)
发布于 2022-01-14 12:45:55
您需要在app.use(..)
中的上下文路径和路由器之间放置自定义中间件。
const router = express.Router();
router.post('/', (req, res) => {
service.post(req,res);
});
router.get('/', (req, res) => {
service.get(req,res)
});
app.use('/models', (req, res, next) => {
service.setParameter(req);
next();
}, router);
使用上面的代码,中间件将被排除在对'/models'
的所有请求中。
发布于 2022-01-15 02:08:15
您可以使用app.use(async (req,res,next) => {...})
来声明在所有请求中执行的中间件,如果希望首先调用该中间件,则必须在路由之前声明该中间件,中间件必须调用next()
才能继续执行流程,如果您希望在请求结束时被调用,则必须将其放在声明的末尾但在错误中间件之前,在这种方法中,每个路由都必须在功能结束时调用next()
。
优先逼近
const express = require('express');
const app = express();
const router = express.Router();
router.post('/', async (req, res) => {
await service.post(req,res);
});
router.get('/', async (req, res) => {
await service.get(req,res)
});
app.use((req,res,next) => {
console.log("always called");
next();
});
app.use('/',router);
第二次逼近
const express = require('express');
const app = express();
const router = express.Router();
router.post('/', async (req, res, next) => {
await service.post(req,res);
next();
});
router.get('/', async (req, res, next) => {
await service.get(req,res);
next();
});
app.use('/',router);
app.use((req,res) => {
console.log("always called");
});
https://stackoverflow.com/questions/70710503
复制相似问题