【问题标题】:How to send each string object in an array as ajax post data如何将数组中的每个字符串对象作为 ajax 发布数据发送
【发布时间】:2020-05-13 21:59:35
【问题描述】:

我有动态生成的文本框,每个值在发布时都必须存储在 JSON 数组中。我将所有值推送到一个数组中,当我发布它时,数组中的这些值被读取为我的 JavaScript 服务器文件中 JSON 数组中的一个对象。

为了更好地理解,下面是我的代码 sn-p:

// my javascript server

const express = require("express");
const MongoClient = require("mongodb").MongoClient;
const app = express();
const {DB_URL} = require("./credentials");

const connectionString = DB_URL

MongoClient.connect(connectionString, {useUnifiedTopology: true})
.then(client => {

    console.log('Connected to Database');
    const db = client.db('todo-items');
    const itemsCollection = db.collection('items');

    app.use(express.urlencoded({extended: true}));
    app.use(express.static("public"));
    app.set("view engine", "ejs");
    app.use(express.json());

    var items = [];

    app.get('/', (req, res) => {
        db.collection('items').find().toArray()
        .then(items => {
            res.render('result.ejs', { items: items })
        })
        .catch(error => console.error(error))
    })

    app.get('/myForm', (req, res) => res.render("pages/myForm"));
    app.get('/result', (req, res) => res.render("pages/result", {
    items:items}));

    app.post('/myForm', (req, res) => {
        itemsCollection.insertOne(req.body);
        items.push(req.body);
        console.log(req.body);
        res.redirect("/result");
    });

    app.put('/items', (req, res) => {
        itemsCollection.findOneAndUpdate(
            { item: 'anything' },
            {
                $set:{
                    items: req.body.items
                }
            },
            {
                upsert: true
            }
            )
            .then(result => res.json('Success'))
            .catch(error => console.error(error))
    })

    app.delete('/items', (req, res) => {
        itemsCollection.deleteOne(
            { items: req.body.items }
        )
        .then(result => {
            if(result.deletedCount === 0) {
                return res.json('Nothing to delete')
            }
            res.json('deleted the selected item')
        })
        .catch(error => console.error(error))
   })
   const port = 3000
   app.listen(port, function () {
     console.log(`listening on ${port}`)
   })
 }).catch(console.error)
    
<!-- this is my result.ejs -->

<!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="/style.css">
    <title>Assignment 2</title>
</head>
<body>
  <p style="text-align: center; display: inline-block; color: black;">Enter the todo item you want to modify, and the new name you want to give it.</p></br>
  <input type="text" id="item-given" cols="18" rows="2"></br>
  <input type="text" id="item-update-or-delete" cols="18" rows="2"></br>
  <button type="button" id="update-button">Update</button></br>
  <button type="button" id="delete-button">Delete</button></br>
  <div id="message"></div></br>
  <form action="/todoitems" action="POST">
    <fieldset class="items todo-list">
      <legend class="todo-list__title">My Special Todo List</legend>
      <% for(var i = 0; i < items.length; i++) {%>
      <label class="item todo-list__label">
        <input type="checkbox"/>
        <i class="check"></i>
        <span><%= items[i].items %></span>
      </label>
      <% } %>
    </fieldset>
  </form>
      
</body>
</html>
<!-- this is my myForm.ejs -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="https://code.jquery.com/jquery-3.5.0.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <link rel="stylesheet" type="text/css" href="myFormStyle.css">
    <title>My Form</title>
</head>
<body>
<div class="container">
    <br/>
    <br/>
    <div class="form-group">
        <form method="post">
            <div class="table table-bordered" id="item_field">
                    <h1>Todo Item 1</h1>
                    <input type="text" id="item1" class="task" cols="22" rows="2">
                    <button type="button" id="add" class="addButton">+</button></td>
            </div>
            <input type="submit" id="submit" value="Submit"/>
        </form>
    </div>
</div>
</body>
</html>
<script>
    $(document).ready(function() {
        var count = 1;
        //var $itemIds = Array.from($('h1 + .task'));
        //var ids = $itemIds.map(task => $(task).attr('id'));
        $('#add').on('click', function() {
            count++;
            $('#item_field').append('</br><h1>Todo Item ' + count +'</h1><input type="text" id="item'+ count +'" class="task" cols="22" rows="2">');
            $('#add').insertAfter('#item' + count);
        }); 
        $('#submit').on('click', function() {
            var items = [];
            for (let i = 1; i <= count; i++) {
                items.push($('#item' + i).val());
            }
        $.ajax({
            method: 'POST',
            url:'/myForm',
            type: 'POST',
            data: {
                items: items
            }
        }).
        done(function(data) {
        console.log(data);
        }).
        fail(function(error) {
        console.log(error);
        })
        })       
    });



</script>

【问题讨论】:

    标签: javascript html ajax mongodb ejs


    【解决方案1】:

    如果要单独插入项目,请遍历项目数组并插入每个项目,并在插入完成后重定向:

        app.post('/myForm', (req, res) => {
            const itemPromises = req.body.items.map(item => {
                items.push(item);
                return itemsCollection.insertOne(item); // returns a promise
            });
            Promise.all(itemPromises)
                .then(() => res.redirect('/result')
                .catch(console.error);
        });
    

    此外,您必须更改您的 $.ajax 调用,以便以您期望的格式发送数据:

    $.ajax({
        method: 'POST',
        contentType: 'application/json',
        url:'/myForm',
        data: JSON.stringify({
            items: items
        })
    })
    

    最后,更改表单元素的属性,使表单本身不会尝试提交,而只会进行 ajax 调用:

    <form method="post" action="javascript:void(0)">
        <div class="table table-bordered" id="item_field">
            <h1>Todo Item 1</h1>
            <input type="text" id="item1" class="task" cols="22" rows="2">
            <button type="button" id="add" class="addButton">+</button></td>
        </div>
        <input type="submit" id="submit" value="Submit"/>
    </form>
    

    另外,正如您所说,这一行 &lt;span&gt;&lt;%= items[i].items %&gt;&lt;/span&gt; 应该改为 &lt;span&gt;&lt;%= items[i] %&gt;&lt;/span&gt;

    【讨论】:

    • 感谢您的及时答复!我曾尝试使用地图,但它给了我“TypeError:无法读取未定义的属性'地图'”,我不明白为什么。因为数据肯定已存储,但由于某种原因无法读取这些数据。顺便说一句,我很惊讶你回答得如此之快。再次感谢您!
    • @buzzy 没问题。您能否更新您的答案,在该函数中显示 console.log(req.body) 的输出,以便我们查看包含的内容?
    • @buzzy 实际上,我刚刚添加了一个有助于解决此问题的更新
    • 当我执行 console.log(req.body) 时,它会打印 { items: [ 'item 1', 'item 2', 'item 3' ] }。
    • 我用你的最新更新进行了测试,但只有数组中的第一个对象被读取和打印。此外,当我从 myForm.ejs 页面单击提交进行测试时,它会抛出“TypeError:无法读取未定义的属性'map'”并且不会重定向到 result.ejs。当我手动转到 result.ejs 时,只打印了第一个对象 :( 我现在几乎要放弃了哈哈.. 非常感谢.. 你帮了我很多,我很感激你的时间!
    猜你喜欢
    • 2015-11-29
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    相关资源
    最近更新 更多