我正在使用 NodeJs 和 Express 創建一個服務器,但我發現如果我想讓服務上線,我需要使用 Socket.io。在這個服務器中,有一些服務是不需要上線的,這些都是使用快速路由來實作的。這是經過測驗并正常作業的。現在我必須讓一些服務上線。所以,我認為我也應該在我的服務器配置中實作 socket.io。這是我沒有 socket.io 的代碼,完美運行:
const express = require('express');
const morgan = require('morgan');
const cors = require('cors');
const mongoose = require('mongoose');
require('dotenv').config();
const app = express();
const port = process.env.port || 5050;
app.use(morgan('dev'));
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended:true }));
const uri = process.env.ATLAS_URI;
mongoose.connect(uri, {useNewUrlParser:true});
const connection = mongoose.connection;
connection.once('open', () => console.log('Connected'));
const routes = require(#every routes);
app.use(routes);//all created routes
app.listen(port, () => {console.log(`Server listening on port ${port}`)});
現在,我應該正確匯入 socket.io。完成后,我想我可以正確地找出實作我的服務的熱度。因此,我嘗試添加const io = require('socket.io').listend(app)我在另一個 stackoverflow 問題中看到的行,但終端顯示此錯誤:
const io = require('socket.io').listend(app)
^
TypeError: require(...).listend is not a function
所以,我不知道如何整合這兩者。我不知道是否值得使用相同的埠,或者我是否應該為套接字使用另一個埠,但我認為相同的埠會很好。如果有人知道如何在我當前的代碼中實作 socket.io,或者一種同時保留這兩種功能的方法,請幫助我。非常感謝
uj5u.com熱心網友回復:
改變這個:
app.listen(port, () => {console.log(`Server listening on port ${port}`)});
對此:
const httpServer = app.listen(port, () => {console.log(`Server listening on port ${port}`)});
然后,添加以下內容:
const { Server } = require("socket.io");
const io = new Server(httpServer );
這將使您的 Express 服務器和您的 socket.io 服務器共享同一個 http 服務器。由于所有傳入的 socket.io 連接都可以通過一些自定義標頭識別,socket.io 代碼(實際上是底層 webSocket 傳輸執行此操作)可以獲取這些連接并獨立于常規 http 請求處理它們。
在socket.io 檔案中查看大量示例,這些示例從早期就得到了極大的改進。
有時,查看不同的示例很容易混淆,因為有十幾種不同的方法可以創建與 Express 一起使用的 http 服務器。這里的一般想法是,無論您使用哪種方式,只需確保將您創建的 http 服務器實體分配給一個變數,然后您可以將其用于 socket.io 服務器初始化(如上所示)。在您的 Express 代碼中,app不是服務器。那是 Express 應用程式物件,它也是一個 http 請求處理程式。這不是服務器。服務器是您從中獲得的東西http.createServer()或app.listen()回傳給您的東西(在http.createServer()內部呼叫之后)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/373145.html
