Как мне использовать html, css и js в качестве пост-ответа при использовании CORS? - PullRequest
0 голосов
/ 05 октября 2019

Попытка понять лучший способ отправки html, css, js файлов обратно клиенту через запрос Post. Я использую экспресс, реагирую.

Пока у меня есть базовый пост-маршрут, который возвращает скомпилированный компонент с данными (используя руль) в качестве ответа. Однако обработчики событий, css и js отсутствуют. Я не уверен, как обслуживать их вместе с HTML в качестве ответа на запрос AJAX POST в другом домене.

Я использую webpack для SSR и подумал, что это будет работать примерно так же, но это не такт.

Вот то, что у меня есть до сих пор ... это просто возвращает HTML из моего компонента реакции.

app.post("/", async (req, res) => {
  const theHtml = `
  <html>
  <head><title>My First SSR</title>
  <link href='http://localhost:8080/app.css'></link>
  <script src="http://localhost:8080/app.js" charset="utf-8"></script>
  <script src="http://localhost:8080/vendor.js" charset="utf-8"></script>
  </head>
  <body>
  <h1>My First Server Side Render</h1>
  <div id="reactele">{{{reactele}}}</div>
 </body>
  </html>
  `;

  const hbsTemplate = hbs.compile(theHtml);
  const reactComp = renderToString(<App />);
  const htmlToSend = hbsTemplate({ reactele: reactComp });
  res.send(htmlToSend);
});

Вышеприведенное работает и возвращается только без js, обработчиков событий css и т. Д. Вот компонент приложения

class App extends React.Component {
  constructor() {
    super();
    this.handleButtonClick = this.handleButtonClick.bind(this);
    this.handleTextChange = this.handleTextChange.bind(this);
    this.handleReset = this.handleReset.bind(this);

    this.state = {
      name: "",
      msg: ""
    };
  }

  //Handlers
  handleButtonClick = e => {
    const nameLen = this.state.name.length;
    if (nameLen > 0) {
      this.setState({
        msg: `You name has ${nameLen} characters including space`
      });
    }
  };

  handleTextChange = e => {
    this.setState({ name: e.target.value });
  };

  handleReset = () => {
    this.setState({ name: "", msg: "" });
  };
  //End Handlers

  render() {
    let msg;

    if (this.state.msg !== "") {
      msg = <p>{this.state.msg}</p>;
    } else {
      msg = "I have a state of none";
    }
    return (
      //do something here where there is a button that will replace the text
      <div>
        <header className="App-header">
        {/* <img src={logo} className="App-logo" alt="logo" /> */}

        {/* <img src={logo} className="App-logo" alt="logo" /> */}
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
        <label>Your name </label>
        <input
          type="text"
          id="txtName"
          name="txtName"
          value={this.state.name}
          onChange={this.handleTextChange}
        />
        <button id="btnSubmit" onClick={this.handleButtonClick}>
          Calculate Name Length
        </button>
        <button id="btnReset" onClick={this.handleReset}>
          Reset All
        </button>
        <hr />
        {msg}
      </div>
    );
  }
}
export default App;

На стороне клиента я просто добавляю htmlна пустую страницу. Несколько вопросов,

Как мне поддерживать обработчики событий в запрошенном html? Как также отправлять .css и .js вместе?

В некоторых случаях я бы хотел избежать необходимости размещать и поддерживать код «client» на моем интерфейсном сервере? Я надеюсь, что что-то вроде веб-пакета поможет мне?

Спасибо за любые советы / предложения.

РЕДАКТИРОВАТЬ :: Чтобы уточнить это работает, если я получаю доступ к маршруту напрямую. Я получаю корреляции JS и CSS. Просто не через почтовый запрос с другого домена. Я предполагаю, что упускаю некоторые фундаментальные знания о том, как поддерживается dom и выполняются сценарии.

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Итак, моя проблема была на стороне клиента (мой второй домен). Это было то, как я загружал HTML в DOM, мой старый метод был inneHTML на теле. Простой ответ: это не работает.

Мне пришлось загрузить его другим способом, я решил использовать jquery .html (), это вызывает dom для оценки сценариев и т. Д.

@ RohithBalajiВаш комментарий помог мне найти мою проблему.

Большинство API AJAX используют браузер .innerHTML для настройки содержимого. И это удалит теги и, но сценарии будут выполнены. Но, так как голова раздета, я предполагаю, что они не загружаются?

0 голосов
/ 05 октября 2019

Вам просто нужен статический каталог и средство визуализации представления.

В вашем app.js или там, где вы когда-либо инициализировали свой экспресс-экземпляр, добавьте следующее

var hbs = require('hbs');
var path = require('path');
var express = require('express');

var app = express();
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');

Теперь вы можетепросто поместите ваш html-файл в hbs-файл в папку с именем 'views' и просто верните его как

app.post("/", (req, res) => {
 res.render('index.hbs', {variable: 'value'});
});

Для статических ресурсов добавьте следующие строки

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

и поместите свой jsи css или изображения или любые другие статические файлы, которые вы хотите в папке с именем public в корне вашего проекта. Они будут доступны на http://localhost:8080/app.js

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