【问题标题】:Req.Body undefined NODE.JS POST RequestReq.Body 未定义 NODE.JS POST 请求
【发布时间】:2019-07-04 01:43:10
【问题描述】:

我目前正在开发一个与 mysql 数据库通信的简单 Node.JS 应用程序。

应用程序从数据库中获取数据并使用 app.get 将其放入表中,并且运行良好。

我遇到的问题是 req.body 在使用 app.post 时没有返回任何内容。该应用程序将提交到数据库,但因为 req.body 没有返回任何内容,所以值为 null。如果我将 req.body 变量与硬编码变量交换,它将发布实际值,例如“12320”。

因此,我已将问题隔离为发布使用 req.body 的请求。

如果我控制台日志 req.body 它是空的。

我已经阅读了几乎所有关于此问题的 stackoverflow 问题,但未能找到解决方案。

我尝试重新安装 body-parser、express、morgan 和 mysql。

我已尝试在新目录中重新创建应用程序并再次安装模块。

我已尝试重命名变量以防万一有效果(例如 name="test"、req.body.test)

但这一切都无济于事。

<form id="submit_missing" action="/submit_quote" method="POST" enctype="multipart/form-data">

<input type="text" id="submit_quote_id" name="submit_quote_id" placeholder="Quote ID">

<input type="text" id="submit_priority" name="submit_priority" placeholder="Priority" list="priority_list">

<input type="text" id="submit_customer" name="submit_customer" placeholder="Customer">

<input type="text" name="submit_who" id="submit_who" placeholder="Who's On it" list="purchasing">

<input type="text" id="submit_account_manager" name="submit_account_manager" placeholder="Account Manager" list="account_managers">

<button id="submit_quote">SUBMIT</button>

<form>
// server.js

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

app.use(bodyParser.json({ type: '*' }))
app.use(bodyParser.urlencoded({ extended: true }))

app.use(express.static('./public'))
app.use(express.static('./files'))

const user = ***
const pass = ***

function getBoardConnection() {
  return mysql.createConnection({
    host: "localhost",
    port: "3306",
    user: user,
    password: pass,
    database: "board"
  })
}

app.get('/get_board_quotes', (req, res) => {
  const con = getBoardConnection()

  const queryString = "SELECT * FROM board_quotes WHERE quote_complete = '0'"
  con.query(queryString,(err, rows, fields) => {
    if (err) {
      console.log("Failed to query for /get_board_quotes : " + err)
    }
    console.log("Getting data from database for /get_board_quotes")
    res.json(rows)
  })

})


app.post('/submit_quote/', (req, res) => {
  console.log(req.body)
   quote_id = req.body.submit_quote_id
   priority = req.body.submit_priority
   customer = req.body.submit_customer
   who_quoted = req.body.submit_who
   account_manager = req.body.submit_account_manager
   type = ""


   queryString = "INSERT INTO board_quotes (quote_id, priority, customer, who_quoted, account_manager, quote_type) \
   VALUES (?, ?, ?, ?, ?, ?)"

   getBoardConnection().query(queryString, [quote_id, priority, customer, who_quoted, account_manager, type], (err, results, field) => {
     if (err) {
       console.log("Failed to insert new board order " + err)
       return res.redirect('/board/quotes.html')
     }
     console.log("Inserted a new board with id ")
     res.redirect('/board/quotes.html')
   })

})

app.listen(6565, () => {
  console.log("Server is running")
})

输出


Server is running
Getting data from database for /get_board_quotes
{}
Failed to insert new board order Error: ER_BAD_NULL_ERROR: Column 'quote_id' cannot be null

{} 是 console.log(req.body) 的输出

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript html mysql node.js


    【解决方案1】:

    您遇到的问题是您在&lt;form&gt; HTML 标记上设置了enctype="multipart/form-data"。默认情况下,body-parser不会解析带有 Content-Type 标头的主体,multipart/form-data,这就是您告诉浏览器发送的内容。

    有一个简单的方法可以解决这个问题:我建议不要在 &lt;form&gt; 元素上设置 enctype,因为浏览器将默认设置为 application/x-www-form-urlencoded 而这是表单主体的类型 body-parser 将默认解析。

    您可以在调用bodyParser.urlencoded() 时尝试将type: "multipart/form-data" 作为选项传递,这将使body-parser 解析发送给它的具有该内容类型的任何内容。(更正:body-parser如果我告诉它解析multipart/form-data,实际上只是默默地失败了)

    question/answer 可能会有所帮助。

    【讨论】:

    • @ShaneLee 别担心!
    • 跟进:我刚刚再次尝试了选项 2,结果发现 body-parser 根本不支持 multipart/form-data -- 我刚刚得到一个解析得相当奇怪的 JSON 对象。
    【解决方案2】:

    正文解析器不适用于:Content-Type:multipart/form-data 标头

    Multer 用于处理Content-Type:multipart/form-data 标头,同时使用表单数据上传文件

    Body Parser 仅适用于:

    • Content-Type:application/x-www-form-urlencoded,

    • Content-Type:application/json

    删除表单中的enctype="multipart/form-data" 并尝试提交表单

    【讨论】:

      【解决方案3】:

      首先我会建议使用 curl 实用程序来简化 POST 请求,发出以下命令(我在这里假设您从同一台机器调用,因此是 'localhost'):

      curl -d "submit_quote_id=999" -X POST http://localhost:6565/
      

      看看你会得到什么

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        • 2018-11-07
        • 2019-01-28
        • 1970-01-01
        • 2015-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多