代码之家  ›  专栏  ›  技术社区  ›  Chunky Chunk

使用fetch将跨源JSON数据发布到Express backend

  •  0
  • Chunky Chunk  · 技术社区  · 6 年前

    我尝试使用Fetch从表单中发布一些JSON数据,并记录来自Express服务器的响应,这应该是一个包含发布的表单值的简单JSON响应,但我在控制台中只接收到一个空对象。

    JSFiddle Link .

    如何从服务器接收填充的JSON对象响应?

    <form id="myForm">
        <input type="text" placeholder="Enter First Name" name="firstName" />
        <input type="text" placeholder="Enter Last Name" name="lastName" />
        <input type="submit" value="SUBMIT" />
    </form>
    

    JavaScript语言

    const form = document.getElementById("myForm");
    
    form.addEventListener("submit", (e) => {
    
        e.preventDefault();
    
        fetch("http://localhost:5000/form-post", {
                method: "POST",
                mode: "cors",
                body: {
                    firstName: e.target.firstName.value,
                    lastName: e.target.lastName.value
                } 
            })
            .then((res) => res.json())
            .then((data) => console.log(data));
    });
    

    const express = require("express");
    const app = express();
    
    const cors = (req, res, next) => {
    
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Methods", "GET, PUT, PATCH, POST, DELETE");
        res.header("Access-Control-Allow-Headers", "Origin, Content-Type");
    
        next();
    };
    
    app.use(cors);
    app.use(express.json());
    
    app.post("/form-post", (req, res) => {
    
        res
            .status(200)
            .json({
                First_Name: req.body.firstName,
                Last_Name: req.body.lastName
            });
    
    });
    
    app.listen(5000, () => console.log("Server started on port 5000..."));
    

    [编辑:] 它在Postman(附屏幕截图)中运行良好,但在Fetch中似乎不起作用。

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  2
  •   choz    6 年前

    你不能 POST 纯javascript对象。

    但是,请检查所有可能的 Content-type 定义见 RFC 1341 与名单 mime types .

    Fetch body data type must match "Content-Type" header .

    请改为尝试此代码。

    const form = document.getElementById("myForm");
    
    form.addEventListener("submit", (e) => {
      e.preventDefault();
    
      var data = {
        firstName: e.target.firstName.value,
        lastName: e.target.lastName.value
      }
    
      fetch("http://localhost:5000/form-post", {
          method: "POST",
          mode: "cors",
          headers: {
            "Content-Type": "application/json; charset=utf-8",
          },
          body: JSON.stringify(data)
        })
        .then((res) => res.json())
        .then((data) => console.log(data));
    });