Экспресс статическая промежуточная программа возвращает ошибку в журнале - PullRequest
0 голосов
/ 16 октября 2018

Я выполнил готовый проект на своем локальном компьютере и в настоящее время изучаю, как развернуть его на производстве.Я выяснил много вещей в документации для производства и тому подобного, но я застрял на некоторое время с той частью, как сказать моему серверу обслуживать мои статические ресурсы, которые содержат файлы сборки, которые я выполнил с помощью веб-пакета.Для справки, я не использую приложение create-реагировать на приложения. Я использую webpack-dev-server cli.

Я только когда-либо успешно подключался к своему серверу и пробежал маршруты через него, используя MySQL, ноЯ никогда не проверял размещение статических файлов на сервере, когда моя разработка была готова к работе.Я получаю сообщение об ошибке в консоли, когда пытаюсь обслуживать файлы статической сборки.Я не могу определить, произошла ли ошибка из-за неправильного обслуживания моих маршрутов на моем сервере или в моей сборке index.html.

Вот мой код, файл сервера большой, поэтому я не могупокажу только соответствующие части, относящиеся к проблеме, на которой я застрял:

Файл сервера:

const express = require("express");
const bodyParser = require("body-parser");
const path = require("path");
const cors = require("cors");
const router = express.Router();

const app = express();
const port = 5000;

app.use(cors());
// Body Parser Middleware
app.use(bodyParser.json({ limit: "50mb" }));
app.use(bodyParser.urlencoded({ extended: false }));

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept"
  );
  next();
});

app.get("*", function(request, response) {
  response.sendFile(path.join(__dirname + "/../public/index.html"));
});

// Serve static files on server
app.use("../", express.static(__dirname + "public/index.html"));

app.listen(port, () => {
  console.log(`Server started on port ${port}`);
});

Сборка файла Index.html

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

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="theme-color" content="#000000">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
    crossorigin="anonymous">
  <link href='https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700' rel='stylesheet' type='text/css'>
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/v4-shims.css">
  <link href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css" rel="stylesheet">
  <link rel="stylesheet" href="/public/assets/css/pignose.calendar.min.css">
  <link href="/public/assets/css/styles.css" rel="stylesheet" type="text/css">
  <title></title>
</head>

<body>
  <div id="root"></div>

  <script type="text/javascript" src="/public/assets/js/jquery-3.3.1.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
    crossorigin="anonymous"></script>
  <!-- Ck Editor Library -->
  <script src="/public/assets/js/plugins/ckeditor/ckeditor.js"></script>
  <!-- Pignose Calendar -->
  <script src="/public/assets/js/pignose.calendar.full.min.js"></script>
  <script type="text/javascript" src="/public/assets/js/scripts.js"></script>
</body>

</html>

Производство Webpack

const webpack = require("webpack");
const path = require("path");
const CompressionPlugin = require("compression-webpack-plugin");
const nodeExternals = require("webpack-node-externals");
const HtmlWebPackPlugin = require("html-webpack-plugin");

var browserConfig = {
  entry: ["babel-polyfill", __dirname + "/src/index.js"],
  output: {
    path: path.resolve(__dirname + "/build"),
    filename: "bundle.js",
    publicPath: "/"
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
          query: {
            presets: ["react", "env", "stage-0"]
          }
        }
      },
      {
        test: /\.css$/,
        use: [
          { loader: "style-loader" },
          { loader: "css-loader" },
          { loader: "sass-loader" }
        ]
      }
    ]
  },
  plugins: [
    new CompressionPlugin({
      filename: "[path].gz[query]",
      algorithm: "gzip",
      minRatio: 0.8,
      threshold: 8192
    }),
    new webpack.DefinePlugin({
      "process.env.NODE_ENV": JSON.stringify("production")
    }),
    new HtmlWebPackPlugin({
      template: "./public/index.html"
    })
  ]
};

var serverConfig = {
  target: "node",
  externals: [nodeExternals()],
  entry: __dirname + "/server/main.js",
  output: {
    path: path.resolve(__dirname + "/build"),
    filename: "bundle.js",
    publicPath: "/"
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
          query: {
            presets: ["react", "env", "stage-0"]
          }
        }
      }
    ]
  }
};

module.exports = [browserConfig, serverConfig];

Архитектура папки

Folder

Журнал ошибок Iполучаю, когда я пытаюсь подключиться к своему порту для моих файлов сборки:

enter image description here

вторая ошибка:

Second error log.

1 Ответ

0 голосов
/ 16 октября 2018

В настройках экспресс-промежуточного программного обеспечения имеет значение порядок, поскольку app.get("*", function(request, response) находится наверху, каждый запрос будет проходить через него и отправлять index.html.Измените порядок следующим образом:

// Serve static files on server

app.use('/public', express.static(__dirname + "/../public"));

app.get("*", function (request, response) {
    response.sendFile(path.join(__dirname + "/../public/index.html"));
});

, и он должен работать


Редактировать

В качестве вашего запроса о расширении моего ответа здесь происходит то, что вы ужеНе настроив публичную директорию, экспресс-сервер получит следующий обработчик запроса, который app.get("*" , ... отправляет index.html в качестве ответа.Поэтому, когда вы запрашиваете этот файл javascript

<script type="text/javascript" src="/public/assets/js/jquery-3.3.1.min.js"></script>

Он отправит index.html, как я уже говорил, без отправки jquery-3.3.1.min.js и то же самое для всех файлов js и css, кроме вашего браузераожидает файл javascript и попытается проанализировать его так, чтобы файл <!doctype> .. анализировал, и, поскольку он не является допустимым javascript, он печатает ошибку.Надеюсь, это поможет

...