Req.Body undefined NODE.JS POST Request



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

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

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

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

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

我已经阅读了几乎所有关于此的堆栈溢出问题,但无法找到解决方案。

我尝试重新安装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) 的输出

任何帮助将不胜感激。

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

有一个简单的方法可以解决这个问题:我建议不要在<form>元素上设置enctype,因为浏览器将默认为application/x-www-form-urlencoded,这是默认情况下body-parser解析的表单正文类型。

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

这个问题/答案可能会有进一步的帮助。

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

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

正文解析器仅适用于:

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

  • Content-Type:application/json

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

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

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

看看你得到了什么

最新更新