NodeJS: localhost продолжает загружаться

#javascript #node.js #express

#javascript #node.js #экспресс

Вопрос:

Я использую NodeJS для обслуживания некоторых файлов, но страница продолжает загружаться. Вот мой index.js файл.

 const express = require("express");
const path = require("path");
const http = require("http");
const socketio = require("socket.io");

const app = express();
const PORT = process.env.PORT || 3000;

const server = http.createServer(app);
const io = socketio(server);

app.use(express.static(path.join(__dirname, "../public")));
server.listen(PORT, () => {
  console.log("server listening to port: "   PORT);
});
 

Это мой public/index.html

 <!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="icon" href="/favicon.ico">
    <link rel="stylesheet" href="/css/styles.css">
</head>

<body>
    <div id="media-video">
        <video id="media-camera" autoplay="autoplay" playsinline>

        </video>
        <video id="media-remote-video" autoplay="autoplay" playsinline>

        </video>
        <video id="media-screen-capture" autoplay="autoplay" playsinline>

        </video>
        <select name="video" id="media-video-devices">
            <option value="None">None</option>
        </select>
        <select name="audio" id="media-audio-devices">
            <option value="None">None</option>
        </select>
        <button id="start-media-stream">Start Stream</button>
        <button id="end-media-stream">End Stream</button>
        <button id="start-media-screen-capture">Capture Screen</button>
        <button id="end-media-screen-capture">End screen capture</button>
    </div>
    <script src="/socket.io/socket.io.js"></script>
    <script src="/js/index.js"></script>
</body>

</html>
         
 

Страница загружается идеально, включая все файлы JS и CSS, но locahost: 3000 продолжает загружаться.

Комментарии:

1. Попробуйте app.listen вместо server.listen .

2. я хочу использовать сокет. ввод-вывод также, поэтому я слушаю на сервере, а не в приложении.

3. Ваш код выглядит правильно, я воссоздал локально, и он загружается для меня. Возможно, у вас какой-то странный процесс, прослушивающий 3000. Вы проверяли ps -a | grep node

4. но вам все равно нужно вернуть ответ обратно пользователю, иначе сервер зависает до истечения времени ожидания.

5. @uke Я попробовал эту команду, она ничего не возвращает

Ответ №1:

Страница «зависает», потому что вы не отправляете ответ обратно пользователю. Код просто обслуживает статические файлы middleware express, но тогда вы не обрабатываете цикл запроса / ответа…

Это пример того, что вы могли бы сделать:

 // require http native node api...

var http = require('http');

// initialize express...here the server is not listening
// your files are not served yet...

var app = require('express')();

// this is the middleware that serves your static files
// the css and js come from this...

app.use(express.static(path.join(__dirname, "../public")));

// now you create the server using the HTTP module
// passing express as function and the PORT you have set...
// this is listening, not handling your request/response cycle...

http.createServer(app).listen(PORT);

// this is an example of how you end a request response cycle 
// by sending a file back, it could be other things...

app.get('/', function(req, res) {
    res.sendFile("index.js");       
});
 

Комментарии:

1. но я хочу обслуживать весь каталог, который включает index.html , js и css-файл, именно поэтому я выбираю использование expess.static()

2. здесь есть некоторая путаница. Позвольте мне уточнить. Express Statis обслуживает ваши статические файлы, но не обрабатывает цикл ответа на ваш запрос, если вы не настроили его таким образом. Вы все равно будете использовать его в своем коде, но вам нужно завершить цикл ответа, отправив ответ клиенту. В моем примере вы отправляете файл index.js но это могут быть и другие вещи

Ответ №2:

Express создает веб-сервер, когда он создает сервер сокетов, они оба обслуживаются с одного и того же порта, в данном случае 3000. Для подключения к websocket вам необходимо использовать сокет.ввод-вывод для подключения к «ws: // localhost: 3000» вместо любого http-запроса, который вы можете сделать.

Комментарии:

1. проблема не в сокете. ввод-вывод или веб-сервер и сервер сокетов. Страница продолжает загружаться, даже когда загружены все файлы, такие как html, JS и css.