亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Socket IO 和 Express Cross origin 錯誤或控制臺中未找到 404 錯誤

Socket IO 和 Express Cross origin 錯誤或控制臺中未找到 404 錯誤

一只甜甜圈 2023-12-14 16:25:17
盡管運行 cors 庫,但我還是遇到了跨源標頭錯誤,或者只是在控制臺中輪詢時未找到 404。項目結構如下所示我的目標是在每個視圖上都有小聊天小部件。我會將其作為 EJS 部分包含到其他視圖中。我不確定我出了什么問題,我嘗試在端口 5000 上運行 Express,在 8080 或 3000 上運行 Socket IO,所有不同的組合都沒有產生任何好處。前端部分EJS看起來像這樣<ul id="messages"></ul><form action="/" method="POST" id="chatForm"><input id="txt" autocomplete="off" autofocus="on" oninput="isTyping()" placeholder="type your message  here..." /><button>Send</button></form>前端頁面的其余部分如下所示  <head>  <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/3.0.4/socket.io.js" integrity="sha512-aMGMvNYu8Ue4G+fHa359jcPb1u+ytAF+P2SCb+PxrjCdO3n3ZTxJ30zuH39rimUggmTwmh2u7wvQsDTHESnmfQ==" crossorigin="anonymous"></script>    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script><style> etcetc<%- include ('./partialChatWidget.ejs') %>還有JS<Script> var socket = io.connect('http://localhost:5000', { transport : ['websocket'] } );$('form').submit(function(e){    e.preventDefault();     socket.emit('chat_message', $('#txt').val());    $('#txt').val('');    return false;});socket.on('chat_message', function(msg){    $('#messages').append($('<li>').html(msg));});socket.on('is_online', function(username) {    $('#messages').append($('<li>').html(username));});var username = prompt('Please tell me your name');socket.emit('username', username);</script>那么這里出了什么問題,我需要在不同端口上有2個服務器還是2個實例,我一直認為socket IO借用了http服務器,而不是express實例。謝謝你的協助。我可能會補充說,當我嘗試在 2 個不同的端口上運行時,會出現跨源錯誤。否則我會在控制臺中找不到 404。頁面以及部分和初始 JS(Jquery) 運行。
查看完整描述

3 回答

?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

經過一番來來回回......


只需確保盡快將套接字 IO 的前端鏈接加載到頭部即可。


并將這部分包含在前端


var socket = io.connect('http://localhost:5000', { transport : ['websocket'] } );

一定要在服務器端包含這個,這不會有什么壞處,除非你想阻止某些頁面進行 CORS 訪問


app.use(cors({origin: '*'})) 

接下來的 2 個步驟使一切順利。


const app = express();

const http = require('http').Server(app);

const io = require('socket.io')(http,

{

cors: {

origin: "http://localhost:5000 {this is the port of your back end app, not for the socket IO port }",

credentials: true

}}) 

最后,確實是 2 臺服務器。


const server = http.listen(8080, function() {

console.log('listening on *:8080');

});

app.listen(5000, console.log("App Running on http://localhost:5000"));

我花了一段時間,但現在一切都一勞永逸了(我希望)




查看完整回答
反對 回復 2023-12-14
?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

試試這個代碼


`const server = app.listen(PORT,()=>console.log(`listening on port ${PORT}`));

io = require('socket.io').listen(server);

io.on('connection', (socket) => {

console.log('a user connected');

});`


查看完整回答
反對 回復 2023-12-14
?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

app.use((req,res, next)=>{

res.setHeader('Access-Control-Allow-Origin',"http://localhost:3000");

res.setHeader('Access-Control-Allow-Headers',"*");

res.header('Access-Control-Allow-Credentials', true);

next();

});


使用此代碼并安裝較舊的 socket.io 版本 2.3.0


查看完整回答
反對 回復 2023-12-14
  • 3 回答
  • 0 關注
  • 206 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號