2016-11-23 95 views
1

我使用express-ws在我的服務器和客戶端瀏覽器之間發現了可靠的Websocket連接,從而發現了我的web服務器的示例代碼。代碼將開始在3000端口監聽websocket連接。next()調用nodejs中的express-ws模塊

var express = require('express'); 
var app = express(); 
var expressWs = require('express-ws')(app); 

app.use(function (req, res, next) { 
    console.log('middleware'); 
    req.testing = 'testing'; 
    return next(); 
}); 

app.get('/', function(req, res, next){ 
    console.log('get route', req.testing); 
    res.end(); 
}); 

app.ws('/', function(ws, req) { 
    ws.on('message', function(msg) { 
    console.log(msg); 
    }); 
    console.log('socket', req.testing); 
}); 

server.listen(3000); 

express-websocket中next()API的用法是什麼?

回答

1

它調用堆棧中的下一個middleware

中間件功能是可訪問請求對象(req),響應對象(res)和應用程序的請求 - 響應週期中的下一個中間件功能的函數。下一個中間件功能通常由名爲next的變量表示。中間件功能可執行以下任務:

  • 執行任何代碼。
  • 更改請求和響應對象。
  • 結束請求 - 響應循環。
  • 調用堆棧中的下一個中間件。

如果當前中間件功能沒有結束請求 - 響應週期 ,它必須調用next()來控制傳遞到下一個中​​間件 功能。否則,請求將被掛起。 explanation 示例一個簡單的hello world示例使用express,後面我們將定義中間件函數。

var express = require('express'); 
var app = express(); 
app.get('/', function (req, res) { 
    res.send('Hello World!'); 
}); 
app.listen(3000); 

中間件功能

var myLogger = function (req, res, next) { 
    console.log('LOGGED'); 
    next(); 
} 

注意上面到next()呼叫。調用這個函數會調用應用程序中的下一個中間件功能。 next()函數不是Node.jsExpress API的一部分,但是是傳遞給中間件函數的第三個參數。 next()函數可以被命名爲任何東西,但按照慣例,它總是被命名爲「next」。爲避免混淆,請始終使用此約定。

要加載中間件功能,請調用app.use(),指定中間件功能。例如,以下代碼在到根路徑(/)的路由之前加載myLogger中間件功能。

var express = require('express'); 
var app = express(); 
var myLogger = function (req, res, next) { 
    console.log('LOGGED'); 
    next(); 
} 
app.use(myLogger); 
app.get('/', function (req, res) { 
    res.send('Hello World!'); 
}); 
app.listen(3000); 

每次應用程序收到請求時,它都會向終端輸出消息「LOGGED」。

中間件加載順序很重要:首先加載的中間件功能也首先執行。

如果myLogger在到根路徑的路徑後加載,請求將永遠達不到它,並且應用程序不會打印「LOGGED」,因爲根路徑的路由處理程序將終止請求 - 響應循環。

中間件函數myLogger只是打印一條消息,然後通過調用next()函數將請求傳遞到堆棧中的下一個中間件函數。

Source Expressjs guide article