簡體   English   中英

節點和節點中間件中的'req'和'res'參數是什么?

[英]What are the 'req' and 'res' parameters in node and node middleware?

我是Node和Express的新手,其他層與建立帶節點的Web應用程序以及requestresponse參數一起讓我感到困惑。 我的困惑在於這兩個參數通常存在於函數中,但通常不會聲明其中的一個或兩個。 此外,大多數情況下會引入其他參數,例如'next'或其他內容。 例如,我有一個API的以下路由器:

router.route('/teams')
    // create a team at POST http://localhost:8080/api/teams
    .post(function(req, res) {
        var team = new Team();
        team.name = req.body.name;
        team.location = req.body.location;

        // save the new team and check for errors
        team.save(function(err) {
            if (err) {
                res.send(err);
            };
            res.json({ message: 'Team created!' });
        }); 
    })
    // GET all the teams at GET http://localhost:8080/api/teams
    .get(function(req, res) {
        Team.find(function(err, teams){
            if (err) {
                res.send(err);
            };
            res.json(teams);
        });
    });

.post.get都使用reqres作為參數調用函數,但從不使用req 那么,如果沒有定義和使用或者沒有在完全不同的訂單中使用,該函數如何知道如何處理req或res? 或者如果我給他們命名完全不同的東西?

請求和響應究竟發生了什么? 對不起我的無知。 我已經閱讀了文檔,但沒有點擊。

謝謝。

當你使用expressApp.use('/some/route', myRouteHandler); Express將偵聽該路由的請求,當它被命中時,它將調用您提供的功能(回調)。 它將為它提供三個參數:請求和響應,以及下一個。 (實際上可能是四個,但是讓事情變得簡單。)

所以,你的回調可能是這樣定義的:

function myRouteHandler(a, b, c) {
    // do stuff
};

或者像這樣:

function myRouteHandler(req, res, next) {
    // stuff
}

或者干脆:

function myRouteHandler() {
    // stuff
}

無論你做什么,都無關緊要。 應用程序啟動時,express會偵聽請求。

當其中一個匹配路由( /some/route )時,express將在其內部工作中調用您提供的函數,如下所示:

myRouteHandler(requestObject, responseObject, nextMiddleware);

因此,在第一種情況下,您可以使用req訪問請求(例如,請求標頭,完整網址,來電者IP地址或類似信息)。 在第二種情況下,您可以通過撥打電話來訪問它。 在第三種情況下,您可以使用參數[0]。

按照慣例,人們將使用以下形式: myCallback(req, res)並知道Express將把請求對象作為第一個參數,並將響應作為第二個參數。 響應對象實際上有一個方法end(),因此您可以結束請求。 如果還有next()對象,則可以調用下一個中間件。

假設你有一個像這樣定義的路線:

app.use('/api/users', checkAuthorizationHandler);
app.use('/api/users', makeSureTheIPisFromOurInternalNetwork);
app.use('/api/users', nowHandleTheResponse);

每個處理程序都獲得第三個參數。 如果你命名它,你通常在你的函數聲明中稱它為'next'參數。 這意味着,下一個功能是有序的。

假設您的function checkAuthorizationHandler(req, res, next)將檢查req.headers('auth')令牌,如果沒有問題,它將在函數體中調用next()

然后function makeSureTheIPisFromOurInternalNetwork(a, b, c) 它將檢查a.ip是否為LAN IP地址並調用c();

最后你的function nowHandleTheResponse()將找到所有用戶,並使用用戶的JSON對象進行響應: arguments[1].json([user1, user2, user3]);

所以,第一個param是表達給你的東西,它是請求,第二個是響應,第三個是下一個中間件函數。 無論你怎么稱呼他們,他們都在那里。

PS你也可以用四個參數聲明你的中間件:

function(error, req, res, next);

Express實際上會檢查你的功能,如果它發現你有四個params而不是兩個或三個,它會給你在鏈中早期運行的中間件拋出的任何錯誤。 這意味着,如果你的checkAuthHandler說下一個(新的錯誤('未授權'));,你的下一個函數可能會檢查該錯誤,如果它存在,則不給出結果。 然而,檢測錯誤的中間件通常會重新發送('某些錯誤消息');

如果我沒有把你弄糊塗,那就說,我有更多來自這里:)

這是框架公約。 第一個參數是request ,第二個參數是response 如果您要聲明中間件( .use ),則第三個參數是鏈中的next中間件。

只要您知道訂單,就可以根據需要為這些變量命名。 你可以有類似的東西: .post(function(a,b) {}); 然后請求由變量a表示,響應由變量b

如果由於某種原因,您不需要請求,只需要響應,您仍然必須有第一個參數,因為響應由第二個參數表示。

在javascript中,沒有像Java中那樣的方法重載(例如,這可能是你從中獲得混淆的地方)。 函數由其名稱表示,而不是由多少個參數表示。 這是一個簡單的例子:

function logToConsole(level, message) {
  if (!message) {
    message = level;
    level = 'INFO';
  }
  console.log('['+level+']', message);
}

logToConsole('My message'); // prints out: "[INFO] My message"
logToConsole('WARN', 'My message'); // prints out: "[WARN] My message"

您是否注意到我們如何根據message的存在定義level的默認值?

希望這能澄清一些事情。

Requestresponsenext傳遞給所有中間件函數。 request對象包含有關HTTP requestresponse對象用於處理request Expressjs文檔詳細介紹了這些對象。 next()調用用於調度程序,中間件函數可能會或可能不會調用next()具體取決於用法。 Next只需調用以下中間件。

以下是使用next()的示例:

function helloWorld(req,res,next){

     console.log('Hello, world!');
     next();
}

// This function doesn't call next(), therefore it will 
// not call the subsequent middleware in the dispatcher
function goodbyeWorld(req,res,next){
     console.log('Goodbye, world!');
}

app.use(helloWorld);
app.use(goodbyeWorld);

輸出:

你好,世界!

世界再見!

現在讓我們重新排序中間件

app.use(goodbyeWorld);
app.use(helloWorld);

輸出:

世界再見!

不調用helloWorld函數。 注意中間件訂單和next()函數調用的重要性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM