【问题标题】:Network error on posting a request using axios使用 axios 发布请求时出现网络错误
【发布时间】:2020-03-06 11:21:39
【问题描述】:

尝试使用 axios 发布 http 请求时,出现以下错误:

Network Error
- node_modules/axios/lib/core/createError.js:16:24 in createError
- node_modules/axios/lib/adapters/xhr.js:81:25 in handleError
- ... 9 more stack frames from framework internals

我尝试在 package.json 中将“proxy”="http://localhost:8080" 替换为“http://myip:8080”,但错误仍然存​​在。 我也尝试使用 fetch 命令 f react native 但它也给出了同样的错误

package.json 是:

{
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "web": "expo start --web",
    "eject": "expo eject"
  },
  "dependencies": {
    "axios": "^0.19.0",
    "body-parser": "^1.19.0",
    "cors": "^2.8.5",
    "expo": "^35.0.0",
    "express": "^4.17.1",
    "mongoose": "^5.7.9",
    "morgan": "^1.9.1",
    "nodemon": "^1.19.4",
    "react": "16.8.3",
    "react-dom": "16.8.3",
    "react-native": "https://github.com/expo/react-native/archive/sdk-35.0.0.tar.gz",
    "react-native-router-flux": "^4.0.6",
    "react-native-web": "^0.11.7",
    "react-router-dom": "^5.1.2",
    "spectre.css": "^0.5.8"
  },
  "devDependencies": {
    "babel-preset-expo": "^7.1.0",
    "concurrently": "^5.0.0"
  },
  "private": true,
  "proxy": "http://localhost:8080"
}

server.js 是:


const express = require('express')
const bodyParser = require('body-parser')
const morgan = require('morgan')
const app = express()
const PORT = 8080

// MIDDLEWARE
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});
//routing
app.post('/', (req, res, next)=> {
    console.log('server post username: ');
    console.log(req.body.username)
    res.end()
})

// Starting Server 
app.listen(PORT, () => {
    console.log(`App listening on PORT: ${PORT}`)
})

sn-p for axios post 是:

axios.post('/', {
            username: this.state.username,
            password: this.state.password
        })
            .then(response => {
                console.log(response)
                if (response.data) {
                    console.log('successful signup')
                    this.setState({
                        redirectTo: '/login'
                    })
                } else {
                        console.log('Sign-up error');

                    }
            }).catch(error => {
                console.log('Sign up server error: ')
                console.log(error);
            })

执行上述代码的输出是:

Sign up server error: 

Network Error
- node_modules/axios/lib/core/createError.js:16:24 in createError
- node_modules/axios/lib/adapters/xhr.js:81:25 in handleError
- ... 9 more stack frames from framework internals

【问题讨论】:

    标签: node.js reactjs react-native express axios


    【解决方案1】:

    首先我建议你也使用不同的路由命名空间而不是使用app.post('/')尝试app.post(/api`),其次你不向客户端发送任何数据或任何状态码。尝试以下:

    app.post('/api/post', (req, res, next)=> {
        console.log('server post username: ');
        console.log(req.body.username)
        return res.status(200).send({redirectTo: '/login'});
     })
    

    和 axios

     axios.post('/api/post', {
         username: this.state.username,
         password: this.state.password
     })
     .then(response => {
           console.log('successful signup')
           this.setState({
                redirectTo: '/login'
           })
    
     }).catch(error => {
           console.log('Sign up server error: ')
           console.log(error);
     })
    

    另外,我建议您使用 cors 库来处理跨域请求。从 npm(或 yarn 或其他)下载它

    而不是

    app.use(function(req, res, next) {
      res.header("Access-Control-Allow-Origin", "*");
      res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, 
      DELETE');
       res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content- 
    Type, Accept");
       next();
    });
    

    使用这个

    const cors = require('cors');
    app.use(cors())
    

    【讨论】:

    • 我尝试了您建议的所有更改,但我仍然收到相同的错误:(
    • 那么问题出在其他地方。尝试以某种方式获取错误消息。而是记录错误。登录error.message
    • (在axios 请求中)
    • 打印什么
    • [Unhandled promise rejection: TypeError: undefined is not an object (evaluating 'error.response.data')] * components/sign-up.js:37:36 in <unknown> - node_modules/promise/setimmediate/core.js:37:14 in tryCallOne - node_modules/promise/setimmediate/core.js:123:25 in <unknown> - ... 8 more stack frames from framework internals
    【解决方案2】:

    问题已解决,我使用了hostname --ip-address 给出的错误IP(172.0.0.1)。使用ip addr show 给出的inet ip 可以工作。

    【讨论】:

      【解决方案3】:

      这对我有用:

      sudo ufw allow *your server api port here*
      

      【讨论】:

      • 缺乏对该命令作用的解释。请填写您的答案。
      • 在我的情况下,端口不允许访问,然后在执行此命令后端口变为可访问连接。当您使用 USB 仿真器时,这类似于 ADB 命令来反转 tcp 端口 'adb reverse tcp:3000 tcp:3000'。这对我有用!
      猜你喜欢
      • 2020-10-26
      • 2018-08-14
      • 2021-03-26
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 2018-06-21
      • 2022-09-25
      相关资源
      最近更新 更多