【问题标题】:GET http://localhost:3000/hello 404 (Not Found)GET http://localhost:3000/hello 404(未找到)
【发布时间】:2021-10-30 06:06:01
【问题描述】:

我正在关注实施 MERN 的教程,但我遇到了以下错误: GET http://localhost:3000/hello 404 (Not Found) 我做的一切都是正确的,但我无法解决这个问题。以下是我的文件,任何人都可以形成社区帮助,以便我继续前进。我真的很感谢你的帮助。谢谢大家。

前端文件夹:App.js

import React, { Component} from 'react' ;
// import logo from './logo.svg';
import './App.css';
import axios from 'axios' ;

class App extends Component {
   state = {
     hello: null
   }

  componentDidMount() {
      axios.get('/hello')
      .then( res => this.setState({ hello: res.data }))
      .catch( err => console.log(err) )
  
  }

  render() {
     return (
        <div>
          {this.state.hello
            ? <div> {this.state.hello} </div>
            : null }
        </div>
      );
  }
}

export default App;

后端文件夹:App.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');


//import the 'routes' file
var indexRouter = require('./routes')


var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));


// use indexRouter
app.use('/', indexRouter);

module.exports = app;

路线

var express = require('express');

var router = express.Router()  

router.get('/hello', function(req, res) {
    res.json('hello world') ;
})

// this is exported to app.js in the Server folder
module.exports =  router ;

前端文件夹:package.json

...
"eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "proxy": "http://localhost:5000", <==== pointing to localhost
  "browserslist": {
    "production": [
      ">0.2%",
 ...

【问题讨论】:

  • 仅供参考,res.json('hello world') ; 应该是 res.send('hello world') ;
  • 感谢您的更正,但这并没有帮助我解决 404 问题
  • 我没有看到任何app.listen(3000) 你在适当的端口上启动你的服务器。
  • app.listen 位于名为 www 文件的主文件夹中。这个文件有端口号,这是放置app.listen(5000)的地方。
  • 就您的想象而言,我使用 express 生成器安装了 express,它会为您构建文件。

标签: node.js reactjs express


【解决方案1】:

好的,我拿走了你的代码,第一个问题是你的请求被发送到http://localhost:3001/hello - 这意味着它将占用你的前端端口(假设你想分别运行 FE 和 BE,例如端口 3000 和 3001)@ 987654321@

在我用axios.get('http://localhost:3000/hello') 修复axios.get('/hello') 后,我们进入第二个问题。我遇到了 CORS 问题。

为了解决这个问题,我们必须在我们的 express 后端配置 cors - https://expressjs.com/en/resources/middleware/cors.html。 操作:npm i cors 并添加 app.use(cors()); 现在,如果我们使用node index.js 重新运行我们的后端并刷新我们的前端页面 - 我们会得到响应 200 OK。

第三个问题是 - 你没有app.listen()app.listen(PORT, () =&gt; console.log(`app listening at http://localhost:${PORT}`))

好的,这里是代码。首先,我删除了我认为与这种情况无关的所有额外依赖项。然后在我完成所有工作后,我把它们放回去了,但在某些地方我可能忘记了全部归还。我还把你的get 路由直接放在index.js 中——所以这也与你的代码不同(你把它放在单独的模块中)。正如我所说,我试图让事情变得简单易懂。

BE(我用node index.js运行它

var express = require('express');
var path = require('path');
var cors = require('cors')
var createError = require('http-errors');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var app = express();
const PORT = 3000;

app.use(cors())
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
app.use(logger('dev'));
app.use(cookieParser());
 
app.get('/hello', function(req, res) {
    res.send('hello world') ;
})
app.listen(PORT, () => console.log(`app listening at http://localhost:${PORT}`))

module.exports = app;

FE(以 npm start 开头 - 它是 create-react-app - 端口 3001,因为后端运行在端口 3000 上)

export  class App extends React.Component {
  state = {
    hello: null
  }
 componentDidMount() {
     axios.get('http://localhost:3000/hello')
     .then( res => this.setState({ hello: res.data }))
     .catch( err => console.log(err) )
 
 }
 render() {
    return (
       <div>
         {this.state.hello
           ? <div> {this.state.hello} </div>
           : null }
       </div>
     );
   }
 }

【讨论】:

  • 很好地解释了斯特凡!!!,谢谢,我已经用你解释的答案解决了这个问题。我非常感谢。只是我没有使用 express 生成器,所以它创建了一个名为 www 的文件,其中我有端口监听 ``` app.listen(5000) ``` 的东西。谢谢
  • @Stefan Zivkovic 我不使用你的答案。但是因为你解释得很好所以点赞了。
猜你喜欢
  • 2021-09-14
  • 2018-11-22
  • 2019-07-24
  • 1970-01-01
  • 2021-05-19
  • 2019-12-11
  • 2020-07-10
  • 1970-01-01
  • 2016-08-06
相关资源
最近更新 更多