代码之家  ›  专栏  ›  技术社区  ›  Advena

使用fetch()将数据发布到nodejs

  •  2
  • Advena  · 技术社区  · 6 年前

    我一直在努力学习nodejs this NodeJs Youtube Tutorial .

    我已经和 Fetch API 几个月从wordpress和google的后台获取数据。

    youtube播放列表的最后一段视频是关于创建一个带有nodejs和npm的express、ejs和body解析器的待办事项列表应用程序。

    然而, at part 4 of the To do list app ,这个“老师”使用jquery和ajax将数据发布到nodejs( His jQuery Code Snippet )由于我只使用fetch()来处理ajax post请求,所以我想用普通javascript继续使用这个方法。

    我的ejs文件名为todo.ejs,存储页面的html模板如下所示:

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
        <link rel="stylesheet" href="/assets/style.css">
        <!-- Works because of express middleware.
        Since we stored the public folder as a static folder,
        we can request anything within that folder from the url, such as
        127.0.0.1:3000/assets/styles.css
        -->
    
        <title>Todo List</title>
    </head>
    
    <body>
       <h1>My Todo List</h1>
        <div id="todo-table">
            <form>
                <input type="text" name="item" placeholder="Add new item..." required>
                <button type="submit">Add Item</button>
            </form>
            <ul>
                <% todos.forEach(todoList =>{ %>
                 <li> <%= todoList.item %> </li>   
               <% }) %>
            </ul>
        </div>
    </body>
    <script src="/assets/script.js"></script>
    
    </html>
    

    我的script.js(链接到todo.ejs页面)如下所示:

    document.addEventListener("DOMContentLoaded", function (event) {
        let submitButton = document.querySelector("button");
        let textField = document.querySelector("input");
    
        submitButton.addEventListener("click", addItem);
    
        function addItem() {
    
            let newItem = textField.value;
            let todo = {
                item: newItem
            };
    
            fetch("/todo", {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify(todo)
                }).then((res) => res.json())
                .then((data) => console.log(data))
                .catch((err) => console.log(err))
        }
    
    });
    

    处理所有get/post请求的控制器todocontroller.js如下所示:

    let bodyParser = require("body-parser");
    let urlencodedParser = bodyParser.urlencoded({ extended: false });
    
    // Have some items already in place
    let data = [{item: "Get milk"} , {item: "Walk dog"} , {item: "Clean kitchen"}];
    
    module.exports = function (app) {
    
        //Handle get data requests
        app.get("/todo", function (req, res) {
            res.render("todo", {todos: data});
        });
    
        //Handle post data requests (add data)
        app.post("/todo", urlencodedParser, function (req, res) {
            console.log(req.body);
        });
    
        //Handle delete data requests
        app.delete("/todo", function (req, res) {
    
        });
    };
    

    现在,每当我用一些文本填充输入字段并点击enter按钮时,我的终端输出空对象:

    CMD output of POSTed data

    基于这些空对象,一定是我的post请求没有被正确地接受/发送。

    我的文件树如下所示: File tree of whole project

    有人可能(可能是显而易见的)对此有答案吗? (我知道我只需要抓住他的jquery ajax代码片段就可以了,但我急切地想用普通javascript来理解它)

    提前感谢大家抽出时间来帮助我:)

    1 回复  |  直到 6 年前
        1
  •  3
  •   FINDarkside    6 年前

    您需要使用bodyparser.json而不是bodyparser.urlencoded。

    顾名思义,urlencoded将解析url参数,而bodyparser.json将解析请求正文中的json。