【问题标题】:How to properly make a GET request with redux and express.js如何使用 redux 和 express.js 正确发出 GET 请求
【发布时间】:2020-12-30 13:43:21
【问题描述】:

我在使用 redux 和 express.js 发出 GET 请求时遇到问题。我需要将一些日期传递给后端,然后它将查询一些销售报告。现在我使用了邮递员,它可以工作,它为我提供了我需要的数据,但是当我执行 redux 部分并尝试显示该数据时,它显示“无法在 'Window' 上执行 'fetch':使用 GET/HEAD 请求方法不能有主体”。现在我知道我需要删除正文并将查询添加到 url,但我该怎么办?我应该在哪里做?如果我需要同时修改前端和后端以获取查询,我感到很困惑。谁能帮我解决这个问题? 这是我到目前为止所做的:

前端(Redux)[已编辑]

export const getCustomProfitReport = (startDate, endDate) => (dispatch) => {
    dispatch(customProfitReportLoading(true))

    const bearer = 'Bearer ' + localStorage.getItem('token')

    let params = {
        "param1": startDate,
        "param2": endDate
    }

    let query = Object.keys(params)
                .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k]))
                .join('&')

    return fetch(baseUrl + 'custom-profit-report?' + query, {
        method: 'GET',
        headers: {
            'Authorization': bearer
        }
    })
    .then(response => {
        if (response.ok) {
            return response
        }
        else {
            var error = new Error('Error ' + response.status + ': ' + response.statusText);
            error.response = response;
            throw error;
        }
    },
    error => {
        var errmess = new Error(error.message);
        throw errmess;
    })
    .then(response => response.json())
    .then(sales => dispatch(addCustomProfitReport(sales)))
    .catch(error => dispatch(customProfitReportFailed(error.message)))
}

这是后端(快递)

const express = require('express')
const bodyParser = require('body-parser')
const mongoose = require('mongoose')
var authenticate = require('../authenticate')
const cors = require('./cors')

const Sales = require('../models/sales')

const customProfitRouter = express.Router()

customProfitRouter.use(bodyParser.json())

customProfitRouter.route('/')
.options(cors.corsWithOptions, (req, res) => { res.sendStatus(200) })
.get(cors.cors, authenticate.verifyUser, authenticate.verifyAdmin, (req,res,next) => {
    let start = req.params.startDate
    let end = req.params.endDate

    Sales.find({ 
        "createdAt": 
        { 
            $gte: start, 
            $lte: end 
        } 
    })
    .populate('property')
    .populate('fee')
    .then((sales) => {
        res.statusCode = 200
        res.setHeader('Content-Type', 'application/json')
        res.json(sales)
    }, (err) => next(err))
    .catch((err) => next(err))
})

module.exports = customProfitRouter

【问题讨论】:

    标签: node.js reactjs express redux get


    【解决方案1】:

    解决方案是修改后端中的一些行,以便将开头和结尾替换为:

        let start = req.query.param1
        let end = req.query.param2  
    

    稍作修改,它就可以工作了。希望它对某人有所帮助!

    【讨论】:

      【解决方案2】:

      编辑更新的问题

      您应该从以下位置更改您的客户端代码:

      let params = {
          "param1": startDate,
          "param2": endDate
      }
      

      到:

      let params = {
          startDate: startDate,
          endDate: endDate
      }
      

      或更短的版本:

      let params = {
          startDate,
          endDate
      }
      

      您不能发送具有正文的GET 类型的获取请求。

      请参阅此answer,了解如何将fetch 与查询参数一起使用。
      此外,在您的快递服务器端 - 从req.params insted 或req.body 获取参数 - 检查快递请求documentation here

      您可以在“获取”github issues page 上阅读有关该问题的更多信息。

      【讨论】:

      • 感谢您的回复。现在我修改了 redux 部分,因为我在您链接的帖子上观看了一些示例。当我编辑帖子时,请看上面。正如你告诉我的那样,我替换了后端。什么不见​​了?我在正确的方向吗?如何从后端获取两个参数,比如哪个是哪个?
      猜你喜欢
      • 1970-01-01
      • 2020-09-30
      • 2018-04-24
      • 1970-01-01
      • 2020-10-10
      • 2016-09-17
      • 2019-03-10
      • 1970-01-01
      • 2011-06-18
      相关资源
      最近更新 更多