Req.Body未定义的NODE.JS POST请求

时间:2019-02-10 11:01:40

标签: javascript html mysql node.js

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

该应用程序从数据库获取数据,并使用app.get将其放入表中,并且工作正常。

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

因此,我隔离了发布使用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)的输出

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您遇到的问题是,您在enctype="multipart/form-data" HTML标记中设置了<form>。默认情况下,body-parser 解析带有Content-Type的{​​{1}}头的正文,这是您告诉浏览器发送的内容。

有一个简单的方法可以解决此问题:建议不要在multipart/form-data元素上设置enctype,因为浏览器默认为<form>,这是表单主体application/x-www-form-urlencoded将默认进行解析。

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

question/answer可能会提供进一步的帮助。

答案 1 :(得分:0)

正文解析器不适用于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"并尝试提交表单

答案 2 :(得分:0)

起初,我建议使用curl实用程序简化POST请求,发出以下命令(我假设您是从同一台计算机上调用的,因此是“ localhost”):

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

看看你会得到什么