【问题标题】:Request works on Postman, but is received as 'undefined' by FETCH请求适用于 Postman,但被 FETCH 接收为“未定义”
【发布时间】:2022-01-07 11:49:49
【问题描述】:

无法将信息发送到后端。目前,我的前端有以下fetch 函数:

function appending() {
        console.log('in Appending');
        console.log('formInfo', formInfo);
        console.log('formInfofrom', formInfo.from)
        
        fetch('http://localhost:3001/add-transaction', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
            },
            body: {
                from: formInfo.from,
                to: formInfo.to,
                amount: formInfo.amount,
                fee: formInfo.fee
            }
        }).then((backendResponse) => {
            if(backendResponse.ok)
                return backendResponse.json();
        }).then((theJSON) => {
            // ERROR: 1 - not enough funds
            // ERROR: 0 - no errors
            console.log('theJSON: ', theJSON);
            console.log('Error is: ', theJSON.error);

            if(theJSON.error === 1) {
                console.log('Insufficient')
                setBackendError("insufficient");
            }
            else if (theJSON.error === 0) {
                console.log("Sufficient funds")
                setBackendError("sufficient")
            }
            else {
                console.log("Mongo error")
                setBackendError("mongo");
            }

        }).catch((error) => {
            console.log('error is', error);
        })
    }

formInfo 是一个 JSON 对象,它有 4 个键/值对,from 键、to 键、amountfee

const formInfo = { "from": "", "to": "", "amount": "", "fee":"" };

发送交易后检查控制台时,我看到以下内容:

这告诉我它是有效的。但是,当我检查后端时,我在控制台中看到 req.body.from 的结果为 undefined

这条路线的代码如下:

app.post('/add-transaction', (req, res) => {
        
    console.log('requestFrom', req.body.from);

        blockModel.find({ $or: [{ from: req.body.from }, { to: req.body.from }, { miner: req.body.from }] }).then((blocks) => {
            if (!blocks.length) {
                yakhicoin.addBlock(new Block("system", req.body.from, 1000, 0, "null", 0));
                const newblock = new blockModel(yakhicoin.getLatestBlock());
                newblock.save();
            }
            let balance = 0;
            for (const block of blocks) {
                if (block.from == req.body.from) {balance -= (block.amount + block.fee);}
                if (block.to == req.body.from) {balance += block.amount;}
                if (block.miner == req.body.from) {balance += (block.fee + block.reward);}
            }
            if (req.body.amount <= balance || (!blocks.length && req.body.amount <= 1000)) {
                const formData = {
                    "from": req.body.from,
                    "to": req.body.to,
                    "amount": req.body.amount,
                    "fee": req.body.fee
                }
                const newtransaction = new transactionModel(formData);
                newtransaction
                    .save() //  Promise
                    .then( //resolved...
                        (success) => {
                            res.send({"transaction" : success, "error" : 0});
                        }
                    )
                    .catch( //rejected...
                        (error) => {
                            res.send({"error" : error});
                        }
                    );
            }
            else
                res.json({"error" : 1})
        })
})

当我在 POSTMAN 中使用相同的路线时,一切正常:

带有以下标题:

无论我多久检查一次,我都看不出为什么会发生此错误。为什么formInfo 在发送前就存在时,突然被接收为未定义?我还启用了cors()。任何帮助表示赞赏!

【问题讨论】:

  • 您应该使用开发工具中的“网络”选项卡来调试请求,而不是“控制台”选项卡。如果“网络”选项卡中的请求与邮递员中的请求匹配,您应该会看到相同的行为服务器端。
  • 您好!我刚刚检查了网络选项卡,它说有效负载有[object Object]: ,知道如何处理这个吗? imgur.com/LsmPz4q
  • 检查浏览器请求中的“content-type”标头。确保它与邮递员中的内容相匹配。
  • 你好,我做到了,但还是不行:(
  • 请以文字形式提供所有代码、错误、数据等,而不是文字图片。请参阅 How to Ask,其中写道:“请勿发布代码、数据、错误消息等的图片。 - 将文本复制或输入到问题中。”

标签: javascript reactjs postman


【解决方案1】:

问题是浏览器示例中的正文编码与邮递员示例中的不同。

当使用您当前使用的内容类型时,您的帖子请求中的正文应该是一个字符串(下面的示例)。

fetch(url, {
    method: 'post',
    headers: {
      "Content-type": "application/x-www-form-urlencoded; charset=UTF-8"
    },
    body: 'from=xxxxx&to=yyyyyy....etc'
  })

或者您可以更改内容类型并将对象字符串化。

fetch(url, {
    method: 'post',
    headers: {
    Content-Type: 'application/json',
    // 'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: JSON.stringify(formInfo)
})

【讨论】:

  • 你好,这个解决了,真的只是字符串化!!谢谢你:)
猜你喜欢
  • 2018-06-22
  • 2016-12-16
  • 2021-09-21
  • 2022-01-21
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 2020-07-07
相关资源
最近更新 更多