NodeJS, Экспресс. Не удается загрузить статический контент - PullRequest
0 голосов
/ 18 марта 2019

Я пытался написать сервер узлов, который запускал бы приложение React, созданное create-react-app.На самом деле, происходит что-то странное, и я понятия не имею, что я делаю неправильно (запустите приложение как node server/index.js):

export default (app, dirname) => {
app.use(favicon(path.join(dirname, '..','build', 'favicon.ico')));
app.use(express.static(path.join(dirname, '..','build')));


// initialize routers
bootRotes(app);

if (process.env.NODE_ENV === AVAILABLE_ENVIROMENTS.DEVELOPMENT) {
    expressBootDev(app, dirname);
} else {
    app.get('/*', (req, res) => {
        res.sendFile(path.join(dirname, '..',  'build', 'index.html'));
    });
}
}

build папка содержит приложение реакции на сборку, которое создало следующую командуnpm run build

Странные вещи происходят, когда после загрузки страницы индекса она пытается загрузить статический контент.Например http://localhost:5000/static/js/2.30e86b6e.chunk.js.Браузер просто добавляет / после каждого статического URL контента, и он превращается в http://localhost:5000/static/js/2.30e86b6e.chunk.js/, и, конечно, этот URL не соответствует промежуточному программному обеспечению express.static.Более того, я проверил через Postman, что URL GET http://localhost:5000/static/js/2.30e86b6e.chunk.js withot / в конце предоставляет ожидаемый контент.

Я работаю с PRODUCTION env, это означает, что expressBootDev не оказывает никакого влияния.

У кого-нибудь есть такая же проблема?Я провел весь день и не знаю, как его исправить.

Когда я создаю простой код в корневой папке приложения с почти такой же логикой и запускаю как node server.js, он работает какожидается:

//server.js
const express = require('express');
const favicon = require('express-favicon');
const path = require('path');
const port = process.env.PORT || 8080;
const app = express();
app.use(favicon(__dirname + '/build/favicon.ico'));

app.use(express.static(__dirname));
app.use(express.static(path.join(__dirname, 'build')));
app.get('/ping', function (req, res) {
  return res.send('pong');
});
app.get('/*', function (req, res) {
   res.sendFile(path.join(__dirname, 'build', 'index.html'));
});
app.listen(port);

И я не вижу принципиальной разницы

1 Ответ

0 голосов
/ 18 марта 2019
var fs = require('fs');
var express = require('express');
var router = express.Router();

// GET: Sent some basic info for usage
router.get('/', (req, res, next) => {

  var fname = __dirname + '/../public/index.html';

  var val = fs.readFile( fname, 'utf8', ( err, data) =>   {
        //send can only be called once, write can be called many times,
        // in short res.send(msg) == res.write(msg);res.end();
        res.writeHeader(200, {"Content-Type": "text/html"});
        res.write(data);
        res.end();
    });
});

module.exports = router;

Вот пример того, как вы можете сделать статический файл, обслуживающий узел. https://github.com/msatyan/ApiServe1/blob/master/routes/index.js Полный проект https://github.com/msatyan/ApiServe1

К вашему сведению: Node.js с HTTP1 не эффективен для статического обслуживания файлов, я считаю, что поддержка HTTP2 в узле решает эту проблему. Причиной неэффективности HTTP1 является то, что он должен перенести содержимое файла, прочитанное на собственном уровне, на уровень JavaScript, а затем отправить его через HTTP-сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...