【问题标题】:Getting an empty request body even when using a body parsing middleware即使使用正文解析中间件也得到一个空的请求正文
【发布时间】:2017-12-26 07:37:11
【问题描述】:

我正在尝试实现我的这个小登录系统,并且我有一个表单可以向我的 webpack 开发服务器发送一个发布请求,而后者又将请求代理到我的服务器。

这是处理表单提交并向服务器发送 POST 请求的函数。

handleSubmit = (e) => {
  e.preventDefault();
  this.props.form.validateFields((err, values) => {
    if (!err) {
      console.log('Received values of form: ', values);
      fetch('/login', {
        method: 'POST',
        body: values
      });
    }
  });
}

当我单击登录时,我确实会在控制台中记录我的值,如下所示 http://prntscr.com/hsbpyp

这是处理登录端点的服务器端代码

const app = express();

app.use(bodyParser.urlencoded({ extended: false }));

app.post('/login', (req, res) => {
  console.log('Got user information: \n', req.body);
  res.send('asd');
})

app.use('/graphql', bodyParser.json(), graphqlExpress({ schema }));

app.use('/graphiql', graphiqlExpress({ endpointURL: '/graphql' }));



app.listen(3001, () => {
  console.log(`
    =====
    Server running at http://localhost:3001/
    GraphiQL running at http://localhost:3001/graphiql/
    =====
  `)
})

如您所见,我确实使用 body-parser 中间件来解析 req.body 但是当我尝试记录正文时,我得到一个空对象 http://prntscr.com/hsbqrd

有人可以帮我弄清楚我的代码发生了什么吗?

【问题讨论】:

  • 您是否在浏览器中检查了请求负载?
  • 是的,我确实在问题中为您提供了截图
  • 不是那个..在您的请求中。您的发送..chrome 网络?
  • @zabusa 是的,它确实包含有效负载,检查一下prntscr.com/hsbxh4
  • 尝试使请求 url 编码而不是 form-data

标签: javascript node.js express body-parser


【解决方案1】:

请求作为 multipart/form-data 发送到服务器。 body-parser 不支持 multipart/form-data。如果您确实需要这种格式的 POST 请求,请查看 multer 或 formidable。

【讨论】:

  • 你怎么知道它是否是一个多部分/表单数据?
  • 您在此处显示的屏幕截图prntscr.com/hsbxh4 表明它是多部分/表单数据。如果您检查或输出 Content-Type 请求标头,您将看到它被发送的格式。您可以自己将请求正文构建为 json 并作为 json 发送,在这种情况下,您需要将 bodyParser.json() 添加到登录路由处理程序。或者修改您的表单以提交为 urlencoded,这是您当前尝试使用的正文解析器。
  • 抱歉耽搁了,我会调查一下。谢谢
【解决方案2】:

通过添加 JQuery 脚本尝试这个 ajax 请求,我运行了你的服务器,问题是请求不是服务器,我对 HTML 请求不太擅长我什至尝试了 MDN 示例,但它们不起作用,这段代码与您的服务器配合得很好:

$.post("/login",
{
    name: "name",
    pass: "password"
},
function(data, status){
    console.log(data)
    console.log(status)
});

这是你需要的脚本:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

【讨论】:

  • 我正在使用 ReactJS,所以我不想在其中包含 jquery。
【解决方案3】:

也许在您的客户端,您应该尝试使用这种方法?

var values = {
    username: 'test',
    password: 'test'
};

fetch("/login", {
   method: "POST",
   headers: {
     'Accept': 'application/json, text/plain, */*',
     'Content-Type': 'application/json'
   },
   body: JSON.stringify(values)
});

更多信息在这里:Fetch Post JSON data

编辑

我认为您还必须使用这样的 json 数据配置 bodyParser:

app.use(bodyParser.json({limit: '200mb'}));

希望对你有帮助。

【讨论】:

  • 会尝试回到你身边
  • 如果您以 JSON 格式发送请求,那么您还需要将 bodyParser.json() 添加到您的登录路由处理程序中。
  • @buoyantair : 你可以试试 bodyParser.json,就像我的编辑一样?
猜你喜欢
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 2021-10-05
  • 2021-07-09
  • 2021-11-12
  • 2022-07-18
  • 1970-01-01
  • 2019-06-11
相关资源
最近更新 更多