«Экспресс» не определен no-undef - PullRequest
2 голосов
/ 22 сентября 2019

Я внедрял сервер чата websocket для своего веб-приложения с полным стеком и пришел к выводу, что большинство исходных кодов предоставляют учебник только для html + js, и я не совсем уверен, как перейти с JS на JSX.,

Я начал пытаться интегрировать коды js в мой файл компонента чата jsx, но столкнулся с проблемой, что express() is undefined

Вот мой JS для установки сервера экспресс:

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);

uses = [];
connections = [];

server.listen(process.env.port || 3000);
console.log('server running...');

Вот моя попытка сделать это в JSX:

import React, { Component } from "react";

class ChatComponent extends Component {

  state = { 
    express: require('express'),
    app: express(),
    server: require('http').createServer(this.app),
    io: require('socket.io').listen(this.server),
    users: [],
    connections: [],
  }

  render() {
    return (
      <React.Fragment>
      ...

Когда я пытаюсь запустить npm, я получаю это сообщение, но понятия не имею, как это исправить:

./src/components/chat/ChatComponent.jsx
  Line 7:  'express' is not defined  no-undef

Я также включил зависимости express и socket.io в мой package.json и npm, а также обновил его

{
  "name": "javlet-app",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "axios": "^0.19.0",
    "bootstrap": "^4.3.1",
    "express": "*",
    "jquery": "^3.4.1",
    "js-cookie": "^2.2.1",
    "popper.js": "^1.15.0",
    "react": "^16.9.0",
    "react-dom": "^16.9.0",
    "react-google-login": "^5.0.5",
    "react-new-window": "^0.1.2",
    "react-scripts": "3.0.1",
    "react-webcam": "^3.0.1",
    "socket.io": "*",
    "typescript": "^3.6.3",
    "uws": "^10.148.1",
    "yarn": "^1.17.3"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "eject": "react-scripts eject",
    "test": "jest --coverage"
  },
 ...

Буду признателен за любые советы.При необходимости можно предоставить больше кода.Спасибо

1 Ответ

4 голосов
/ 22 сентября 2019

Express - это библиотека на стороне сервера, а реакция - на стороне клиента.Поэтому для настройки приложения чата вы должны создать как экспресс-сервер, так и приложение реагирования.

Экспресс-сервер будет предоставлять приложение реагирования браузеру, а приложение реагирования получит данные чата из экспресса.server.

Для быстрого запуска

Внутри папки проекта создайте папку сервера, а внутри нее файл с именем index.js.Внутри серверной папки из терминала запустите:

npm init -y

, а затем:

npm i express socket.io

, который позаботится о зависимостях сервера.Теперь внутри index.js:

server / index.js:

const app = require("express")();
const server = require("http").Server(app);
const io = require("socket.io")(server);

server.listen(4000);

app.get("/", function(req, res) {
  res.send("express-server");
});

io.on("connection", function(socket) {
  socket.emit("news", { message: "Hello World" });
  socket.on("my other event", function(data) {
    console.log("response to my other event: ", data);
  });
});

Это настраивает сервер на локальный хост: 4000.Чтобы проверить это, из терминала - внутри папки сервера - запустите:

node index.js

Теперь из браузера перейдите на localhost: 4000, и вы должны увидеть сообщение express-server.Это все, что сделано на бэкэнде.

Включено в приложение реагирования.

В стороне от папки проекта, из терминала запустите:

npx create-react-app client

Это может занять паруминут, но в папке клиента будет создано базовое приложение реакции.

Когда создание-реакции-приложения завершится, пора установить зависимости реагирования, поэтому внутри папки клиента запустите:

npm i socket.io-client

Почти там.

Перейдите в client / src / App.js и замените все внутри на:

import React, { Component } from 'react';
import './App.css';
import socketIOClient from 'socket.io-client'

class App extends Component {
  state = {
    news: ''
  }

  componentDidMount() {
    const handleMessage = (message) => {
      this.setState({ news: message })
    }

    const socket = socketIOClient('http://127.0.0.1:4000')
    socket.on('news', function (data) {
      handleMessage(data.message)
      socket.emit('my other event', { my: 'data' })
    })
  }

  render() {
    return (
      <div className="App">
        <header className="App-header">
          <h1>React Socket.io</h1>
          <p>{this.state.news}</p>
        </header>
      </div>
    );
  }
}

export default App;

Теперь, если вы идете в терминал внутри папки клиента, изапустите:

npm run start

Это запустит приложение реагирования и автоматически откроет приложение в вашем браузере.

В этот момент вы должны запустить приложение реагирования в браузере и приложение Express.также работает.

Приложение реакции должно отображать:

React Socket.io

Hello World

, а экспресс-терминал должен показывать:

response to my other event: { my: 'data' }

Чтобы объяснить, что произошло в приложении «Реакция» -

  • Мы импортировали socket.io-client в начале страницы - в реакции все зависимости импортируются в начале с помощью операторов import.
  • В начале компонента мы устанавливаем пустую строку для state.newsэто мешает нам получить сообщение об ошибке при первом монтировании компонента, прежде чем мы получим и данные с сервера.
  • Компоненты класса React имеют ряд встроенных методов, известных как методы жизненного цикла, компонентDidMount является одним изэто метод, который запускается один раз, как только компонент монтируется в браузере.Именно здесь мы подключились к серверу экспресс-связи, поэтому socket.io прослушивает данные с сервера, когда он получает сообщение, передает его в функцию handleMessage, которая вызывает setState () с сообщением.
  • setState () - это метод, встроенный в реагирование, он используется для изменения / добавления значений в состояние компонента.
  • Наконец, благодаря тому, как работает реагирование, так как состояние изменилось, компонент перерисовывается ипоявится сообщение «Hello World».
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...