Подумайте о том, что делает сервер Node.js
+ express
. Помимо всего прочего, он может обслуживать файлы на основе различных типов http-запросов. Однако вы должны точно указать, какие типы запросов следует прослушивать (GET
, POST
и т. Д.) И по каким маршрутам (/
, /folder
). Вы даже можете прослушивать строки запроса, параметры, тела почтовых сообщений и т. Д. И т. Д. Однако вы можете их определить.
Просмотрите ваш код, какой маршрут вы определили?
Только один: /
, и вы разрешаете GET
запросы к этому маршруту, и в ответ вы обслуживаете index.html
, который имеет всю вашу логику интерфейса, по крайней мере, в этом случае.
Если вы попробуете GET
другие маршруты, например /socket.io/
, по умолчанию вы получите ошибку 404.
Файл сценария, который вы упомянули, имеет значение src
/socket.io
, так как у вас нет маршрута для обслуживания кода socket.io, в работе он не работает.
На локальном хосте, если файлы доступны в одном проекте, ваш браузер может разрешить относительный путь на вашем локальном компьютере. Как только проект развернут, относительные пути больше не обращаются к вашей машине, а попадают на ваш маршрутизатор с полным списком URL. Он ожидает, что эти файлы будут обслуживаться.
Вы можете решить проблему на производстве, указав полную ссылку на необходимый socket.io
код.
БОЛЬШЕ: Пример:
index.js
- см. Комментарии ниже
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
/**
* Your ROUTES
* in production, when someone goes to http://tinatest.gearhostpreview.com/
* they are calling your root route "/"
* Your callback function is sending back index.html from your root directory
* You add __dirname because you don't know where gearhost is actually putting
* your stuff.
*
* In production, you can only access server-side files if you serve them
*/
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
/**
* ONE WAY TO SERVE JS TO YOUR CLIENT
* (there are many better ways of doing this)
*
* If you do this, you will not get a 404 error
*/
app.get('/socket.io/socket.io.js', function(req, res){
// this assumes you have a folder within your root named socket.io
// and that it contains socket.io.js,
res.sendFile(__dirname + '/socket.io/socket.io.js');
})
io.on('connection', function(socket){
socket.on('chat message', function(msg){
io.emit('chat message', msg);
});
});
http.listen(80, function(){
console.log('listening on *:80');
});
index.html
- только глядя на сценарии
<!--
The src is the URI of an external script, that is,
a script external to this particular document.
Below, the URIs are absolute paths for getting for files hosted by other services.
-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>
<!--
You can also use relative paths.
If your src value is /socket.io,
then your page looks for a file
relative to the current location of itself.
On localhost, your page has access to files within its own folder
-->
<script src="/socket.io/socket.io.js"></script>
<!--
HOWEVER, in production, you cannot use relative paths
UNLESS you are serving your files either as static assets
via middleware (http://expressjs.com/en/guide/using-middleware.html)
OR via a public route (http://expressjs.com/en/4x/api.html#app.use)
You are getting a 404 in production because you aren't serving
assets.
BUT!!! you can always use an external 3rd party service
-->