从 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)

  });
}