Express.js маршрутизация 404 - PullRequest
0 голосов
/ 31 октября 2018

У меня проблема с динамической маршрутизацией с помощью express.js в моем приложении реакции. Все работает на localhost, но при развертывании я получаю 400. Вот ссылка: https://shoppyshop.herokuapp.com/item/1

Как вы видите в консоли, есть ошибка 400. Моя цель - правильно извлечь данные из того маршрута, который я настроил в моем index.js экспресса.

app.get('/api/item/:id', function (req, res) {
    let find = data.filter((el => {
        return el.product.id == req.params.id
    }))
    res.json(find)
    console.log('found item')
})

Я понимаю, что есть проблема с экспрессом. Я, вероятно, использую неправильный метод, поэтому он хочет получить значок и остальные файлы с неправильного пути. Погуглил, не смог найти подобную проблему. Как это исправить? Вот компонент, который выбирает данные:

export default class ItemInfo extends Component {
    constructor(props) {
      super(props)

      this.state = {
         data: []
      }
    }

    componentDidMount = () => {
        axios.get(`/api/item/${this.props.match.params.id}`)
            .then(res => {
                const data = res.data;
                this.setState({
                    data,
                    fetched: true
                })
            })
    }

  render() {
      console.log(this.props.match.params.id)
    return (
      <div className="App">
      <SideBar pageWrapId={"mainpage"} outerContainerId={"MainPage"} />
      <div id="mainpage">
          <TopBar />
          <More data={this.state.data} fetched={this.state.fetched}/>
          <Footer />            
      </div>
  </div>
    )
  }
}

Вот ветка с кодом, над которым я работаю: https://github.com/KamilStaszewski/shoppy/tree/itemrouting/client

Мой файл express.js:

const express = require('express');
const path = require('path');
const data = require('./apiData');

const app = express();

// Serve the static files from the React app
app.use(express.static(path.join(__dirname, 'client/build')));
app.disable('etag');


app.get('/category/:category', function (req, res) {
    let find = data.filter((el => {
        return el.product.category == req.params.category
    }));
    res.json(find);
    console.log('found category');
});

app.get('/api/item/:id', function (req, res) {
    let find = data.filter((el => {
        return el.product.id == req.params.id
    }))
    res.json(find)
    console.log('found item')
})

// An api endpoint that returns a short list of items
app.get('/api/data', (req, res) => {
    var questions = data
    res.json(questions);
    console.log('Sent list of items');

});




// Handles any requests that don't match the ones above
app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname + '/client/public/index.html'));
});

const port = process.env.PORT || 5000;
app.listen(port);

console.log('App is listening on port ' + port);

UPDATE:

После многих коммитов и попыток я нашел ответ. Я не знаю, правильно ли это, но это работает. Проблема была с:

app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname + '/client/public/index.html'));
});

Вместо того, чтобы обслуживать индекс из сборки, я обслуживал индекс из публики, в которой не было js. Чтобы все заработало, я изменил на:

app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname + '/client/build/index.html'));
});

Теперь это работает.

1 Ответ

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

Я почти уверен, что это проблема с тем, как вы обслуживаете статические файлы в экспрессе.

Из экспресс-документов:

app.use ('/ static', express.static ('public'))

Теперь вы можете загружать файлы из общего каталога из / префикс статического пути.

http://localhost:3000/static/images/kitten.jpg

http://localhost:3000/static/css/style.css

http://localhost:3000/static/js/app.js

http://localhost:3000/static/images/bg.png

http://localhost:3000/static/hello.html

Однако путь, который вы указываете для функции express.static, относительно каталога, из которого вы запускаете процесс вашего узла. Если Вы запускаете экспресс-приложение из другого каталога, безопаснее использовать абсолютный путь к каталогу, который вы хотите обслуживать:

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

Ваш код имеет следующий код для статической подачи:

app.use(express.static(path.join(__dirname, 'client/build')));

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

Если у вас есть запрос на /, остальные вызовы будут искать данные в пределах client/build. В вашем случае, для вашего get запроса на /api/item/:id, ваш сервер, вероятно, прочитает его, чтобы попытаться найти статический файл в client/build/api/item/:whatevertheitemidis.

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

app.use('/public', express.static(path.join(//Wherever you keep your static files)));


С учетом всего вышесказанного я мог ошибиться в отношении некоторых нюансов express.static, поэтому обязательно ознакомьтесь с документацией . В любом случае, я надеюсь, по крайней мере, направить вас в правильном направлении. Если вы закомментируете свою статическую строку подачи и сделаете запрос с почтальоном, вы должны увидеть, что она работает должным образом.


UPDATE

Я взглянул на твой код и заметил пару вещей:

  1. Я только что вытащил ваш код, и конечные точки работают. Я попытался http://localhost:5000/api/data, и он предоставил ожидаемые данные.

  2. Похоже, что ваша проблема с обслуживанием статических ресурсов, таких как ваш значок, связана с %PUBLIC_URL%/ частью вашего URL-адреса значка избранного в html. Насколько я могу найти, в вашем коде нет ничего, что могло бы перевести это на фактический маршрут. Как только я установил значение /favicon, все заработало как положено.

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