开发者问题收集

使用 React 从 Express API 获取 JSON 时出现问题

2020-11-27
33

我想为我的网站创建一个返回 JSON 的 Express API。为了实现这一点,我更改了默认 users.js 路由中的代码。 这是 routes/users.js 的代码:

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/categories', function(req, res, next) {
  res.json([
    {user_id: 1, name: "Jack"},
    {user_id: 2, name: "John"}
  ]);
});

module.exports = router;

我在 App.js 组件中获取并打印此 JSON:

import React, { Component } from 'react';
import TopBar from './Components/TopBar';
import Timeline from './Components/Timeline';
import './App.css';

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      users: [],
    }; 
  }

  componentDidMount() {
    fetch('/users')
    .then(res => res.json())
    .then(users => this.setState({users}));
  }

  render() {
    return (
      <div className="App">
        <TopBar/>
        <Timeline/>
        {this.state.users.map(user => 
          <li key={user.user_id}>{user.name}</li>
        )}
      </div>
    )
  };
}

export default App;

它运行正常,没有任何错误,但我还想获取类别列表,因此我创建了一个 routes/categories.js 文件,其中包含以下代码:

var express = require('express');
var router = express.Router();

/* GET categories listing. */
router.get('/', function(req, res, next) {
  res.json([
    {category_id: 1, name: "Math"},
    {category_id: 2, name: "English"},
    {category_id: 3, name: "Business"},
    {category_id: 4, name: "Politics"}
  ]);
});

module.exports = router;

问题是,当我尝试从 Categories.js 组件中的此路由获取 JSON 时,它不起作用。这是组件的代码:

import React, { Component } from 'react';

class Categories extends Component {
    constructor(props) {
        super(props);
        this.state = {
          categories: [],
        }; 
      }

      componentDidMount() {
        fetch('/categories/')
        .then(res => res.json())
        .then(categories => this.setState({categories}));
        console.log(this.state.categories);
      }
      render() {
          return (
              <>
                {this.state.categories.map(category => 
                    <li key={category.category_id}>{category.name}</li>
                )}
              </>
          )
      }
}

export default Categories;

我收到以下错误:

Failed to load resource: the server responded with a status of 404 (Not Found)
localhost/:1 Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0

我不知道这是语法错误还是我没有在 Express 中使用正确的设计模式。谢谢阅读。

2个回答

立即出现的一个问题是,如果您从后端获取数据,则需要在前端的获取请求中包含整个 url,例如 http://localhost:8000/users

Noah Kanyo
2020-11-27

好的,就像 Noah Kanyo 所说的那样,问题是因为我没有在 express 的主 app.js 文件中指定路由。我在文件中添加了以下代码,它就成功了:

var categoriesRouter = require('./routes/categories');
app.use('/categories',categoriesRouter);
Grigory Volkov
2020-11-27