从 POST 请求返回空的 object(带有 Node 和 Express 的秘银)
Returning empty object from POST request (mithril w/ Node and Express)
当前遇到一个问题,当我尝试从我的前端完成 POST 请求时,返回的 object 对除 ID 以外的所有内容都为空值。我也没有在控制台中收到任何错误消息。我已经使用 Insomnia 测试了我的服务器,我的 POST 一切正常。我还尝试将 newEntry 的 body 从大括号中取出并包括 headers (即使 Mithril 的文档没有显示使用它们)。
前端
const setData = formDOM => {
const formData = new FormData(formDOM);
console.log("formData", formData)
const newEntry = {};
Array.from(formData.entries()).map(entryValue => {
const key = entryValue[0];
const value = entryValue[1];
switch (value) {
case "false":
newEntry[key] = false;
break;
case "true":
newEntry[key] = true;
break;
default:
newEntry[key] = value;
break;
}
});
console.log("new entry", newEntry)
m.request({
method: 'POST',
url: 'http://localhost:5000/santaslist',
body: {
newEntry
}
}).then((person) => {
console.log("updated entry", person)
});
}
const EntryForm = {
// state
data: {
name: "",
street: "",
state: "",
city: "",
zipcode: "",
nice: false,
naughty: false,
clicked: false,
},
// const { name, street, state, city, zipcode, nice, naughty } = data,
view: (vnode) => (
<form name="entry-form" id="entry-form">
...
<button
class="ui-button"
type="button"
data-toggle="modal"
data-target="#exampleModal"
onclick={() =>
{ setData(vnode.dom)}
}
> Add </button>
...
</form >
),
};
export default EntryForm;
后端
const app = express()
const cors = require("cors")
const pool = require("./db")
const bodyParser = require("body-parser")
// middleware
app.use(cors())
app.use(express.json())//req.body
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
extended: true
}))
//ROUTES//
//create a list item (POST)
app.post("/santaslist", async(req,res) => {
console.log(req.body)
// console.log(req.headers)
// console.log(res)
try {
const { name, street, city, state, zipcode, naughty, nice } = req.body
const newListItem = await pool.query("INSERT INTO listitems(name, street, city, state, zipcode, naughty, nice) VALUES (, , , , , , ) RETURNING *",[name, street, city, state, zipcode, naughty, nice])
res.json(newListItem.rows)
} catch (err){
console.error(err.message)
}
})
"new entry" and "updated entry" console.logs
您的代码有点过于复杂,并且您使用了错误的方法 IMO。 map
用于创建一个新数组,其中转换了现有数组的元素。你要的是forEach
.
试试这个。
let newEntry = {};
(formData.entries()).forEach(entry => {
const [key, value] = entry;
newEntry[key] = value === "true" ? true : false;
})
更新
正如您在回复中指定的那样,formData.entries()
是一个对象而不是数组,应该注意您不能映射对象。但是,您可以执行 for
循环:
const entries = formData.entries();
let newEntry = {};
for (const key in entries)
newEntry[key] = entries[key] === "true" ? true : false;
})
我能够弄清楚,我使用了数据选项而不是正文。
m.request({
method: 'POST',
url: 'http://localhost:5000/santaslist',
// body: newEntry,
data: newEntry
}).then((person) => {
// addPersonToList(person)
console.log("updated entry", person)
});
}
当前遇到一个问题,当我尝试从我的前端完成 POST 请求时,返回的 object 对除 ID 以外的所有内容都为空值。我也没有在控制台中收到任何错误消息。我已经使用 Insomnia 测试了我的服务器,我的 POST 一切正常。我还尝试将 newEntry 的 body 从大括号中取出并包括 headers (即使 Mithril 的文档没有显示使用它们)。
前端
const setData = formDOM => {
const formData = new FormData(formDOM);
console.log("formData", formData)
const newEntry = {};
Array.from(formData.entries()).map(entryValue => {
const key = entryValue[0];
const value = entryValue[1];
switch (value) {
case "false":
newEntry[key] = false;
break;
case "true":
newEntry[key] = true;
break;
default:
newEntry[key] = value;
break;
}
});
console.log("new entry", newEntry)
m.request({
method: 'POST',
url: 'http://localhost:5000/santaslist',
body: {
newEntry
}
}).then((person) => {
console.log("updated entry", person)
});
}
const EntryForm = {
// state
data: {
name: "",
street: "",
state: "",
city: "",
zipcode: "",
nice: false,
naughty: false,
clicked: false,
},
// const { name, street, state, city, zipcode, nice, naughty } = data,
view: (vnode) => (
<form name="entry-form" id="entry-form">
...
<button
class="ui-button"
type="button"
data-toggle="modal"
data-target="#exampleModal"
onclick={() =>
{ setData(vnode.dom)}
}
> Add </button>
...
</form >
),
};
export default EntryForm;
后端
const app = express()
const cors = require("cors")
const pool = require("./db")
const bodyParser = require("body-parser")
// middleware
app.use(cors())
app.use(express.json())//req.body
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
extended: true
}))
//ROUTES//
//create a list item (POST)
app.post("/santaslist", async(req,res) => {
console.log(req.body)
// console.log(req.headers)
// console.log(res)
try {
const { name, street, city, state, zipcode, naughty, nice } = req.body
const newListItem = await pool.query("INSERT INTO listitems(name, street, city, state, zipcode, naughty, nice) VALUES (, , , , , , ) RETURNING *",[name, street, city, state, zipcode, naughty, nice])
res.json(newListItem.rows)
} catch (err){
console.error(err.message)
}
})
"new entry" and "updated entry" console.logs
您的代码有点过于复杂,并且您使用了错误的方法 IMO。 map
用于创建一个新数组,其中转换了现有数组的元素。你要的是forEach
.
试试这个。
let newEntry = {};
(formData.entries()).forEach(entry => {
const [key, value] = entry;
newEntry[key] = value === "true" ? true : false;
})
更新
正如您在回复中指定的那样,formData.entries()
是一个对象而不是数组,应该注意您不能映射对象。但是,您可以执行 for
循环:
const entries = formData.entries();
let newEntry = {};
for (const key in entries)
newEntry[key] = entries[key] === "true" ? true : false;
})
我能够弄清楚,我使用了数据选项而不是正文。
m.request({
method: 'POST',
url: 'http://localhost:5000/santaslist',
// body: newEntry,
data: newEntry
}).then((person) => {
// addPersonToList(person)
console.log("updated entry", person)
});
}