我想在一個攔截層中攔截一個 req.params 專案:
假設我有一個Express服務器的應用實體:我有一個Express服務器的應用實體。
const app = express();
有一個攔截層:
app.use((req, res, next) => //span> {
console.log(req.params.myParam)。
next()。
})
還有很多像這樣的端點:
app. get('/anything/:myParam', (req, res) => res. send('hello'/span>)
這記錄了'undefined',這很自然,因為當 "use "內的攔截中間件被執行時,引數名還沒有被定義。但是我真的需要在這個攔截層中知道myParam引數的值,并且有這些約束條件:
我需要知道我的引數是怎樣的。
有誰知道這種情況的解決方案嗎?
uj5u.com熱心網友回復:
@indrajaj26關于使用app.param()的評論讓我找到了一個可行的解決方案。
以下是我的方法:
/** Express application */
const app = express()。
//攔截層
app.param('myParam', (req, res, next, myParam) => {
/* 將myParam存盤到可重用的地方(比如@nullromo建議的locals)。
* 在我的例子中,我使用zonejs:創建一個分叉的zone,將myParam存盤在zone屬性中。
*/
next()。
});
///消耗攔截的資料。在任何使用 "myParam "作為請求引數的端點的呼叫堆疊的任何地方:
console.log(Zone.current. getZoneWith('myParam')?.get('myParam') )。
謝謝大家的想法!
uj5u.com熱心網友回復:
一個簡單的解決方案是在定義路由的時候傳遞中間件函式。
示例:
function middleware(req, res, next){
console.log(req.params.myParam)。
next()。
}
app.get('/path'/span>, middleware, function(req, res) {
...
});
完整的例子:
const express = require('express') 。
const app = express()。
function middleware(req, res, next) {
console.log(req.params.myParam)。
next()。
}
app.get('/path'/span>, middleware, function(req, res) {
...
});
app.listen(3000, () => console. log('server is online') )。
uj5u.com熱心網友回復:
你可以將引數存盤在response.locals物件上,供以后的中間件使用。
const express = require('express')。
const app = express()。
app.get('/:name', (request, response, next) =>/span> {
//產生某種結果。
const result = `Hello, ${request.params.name ? 'world'}! `。
///將結果和引數保存到request.locals物件上。
response.locals = { params: request.params, result };
//呼叫下一個中間件來傳遞引數和結果。
next()。
});
app.use((request, response, next) =>/span> {
//這里你有引數,因為它們被之前的中間件決議過了。
console.log(`Intercepted: ${JSON.stringify(response.locals.params)}`)。)
// now actually send the response that you wanted to send.
response.status(200).send( response.locals.result) 。
});
app.listen(3000, () => {
console.log('listening') 。
});
這需要在每個處理程式中把request.params存盤在response.locals物件上,這不是最好的。但這也意味著你不必每次都指定攔截器的中間件,如果這對你的情況是個問題的話。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/310210.html
標籤:
