【问题标题】:Can we update multiple records with a single PUT request in Node JS?我们可以在 Node JS 中使用单个 PUT 请求更新多条记录吗?
【发布时间】:2019-05-20 03:47:00
【问题描述】:

我正在尝试使用 Angular HTTP 服务通过单个 put 请求更新多条记录,该服务又使用处理 PUT 请求的 Node JS Express API。但到目前为止,我在互联网上看到的示例是指通过 put 请求更新单个记录。但相反,我想将一组对象传递给来自 Angular Http 服务的 Put 请求,它应该能够在 Node JS API 中读取该集合。到目前为止,我一直在传递一个对象作为请求的一部分,我可以通过“req.body.propertyname”读取它的属性。它可以读取我要传递的整个数组吗?

假设这是我在 Angular 端通过 put 请求更新一本书的代码,如下所示:

updateBook(updatedBook: Book): Observable { 返回 this.http.put(/api/books/${updatedBook.bookID}, updatedBook, { 标头:新的 HttpHeaders({ “内容类型”:“应用程序/json” }) }); }

在 Node js 前端,它能够从客户端(Angular)端读取传递的书籍对象,如下所示:

.put(function(req, res) {

    var data = getBookData();

    var matchingBooks = data.filter(function(item) {
        return item.bookID == req.params.id;
    });

    if(matchingBooks.length === 0) {
        res.sendStatus(404);
    } else {

        var bookToUpdate = matchingBooks[0];
        bookToUpdate.title = req.body.title;
        bookToUpdate.author = req.body.author;
        bookToUpdate.publicationYear = req.body.publicationYear;

        saveBookData(data);
        res.sendStatus(204);

    }
});

我的问题是我是否可以一次传递书籍集合,以便通过一个请求来更新所有书籍?

updateBook(updatedBooks: Book[]): Observable { 返回 this.http.put(/api/books, updatedBooks, { 标头:新的 HttpHeaders({ “内容类型”:“应用程序/json” }) }); }

如果是,那么 Node JS 甚至如何读取从客户端传递的这个数组。 req.body 是否包含传递的这个数组?

【问题讨论】:

  • 嗯.. PUT 基本上是 POST 的一种形式。所以是的,您可以发送数据(例如对象数组)。对 NodeJS 没有太多经验,但是是的,NodeJS 应该在正文中以 JSON 形式接收数据。所以你需要从正文中提取数据。你也可以用 POST 来做,它仍然在正文中。

标签: node.js angular http service


【解决方案1】:

我也是节点 js 的新手,但我尝试通过邮递员更新多个值,然后我点击了“/api/books”,下面的代码对我有用,并使用 PUT 调用一次更新了我的数据库中的所有值。使用 Mongo DB 和 Node JS

app.put('/api/books',(req,res)=>{
    var updatedData="";
    var headersAgain=false;
    for(let i =0;i<req.body.length;i++){
        DataBaseName.findByIdAndUpdate(req.body[i]._id)
        .then(val=>{
            val.url=req.body[i].title
            val.position=req.body[i].author
            val.auto_scroll=req.body[i].publicationYear
            updatedData=val+updatedData
             
            val.save((err,updatedObject)=>{
                console.log('inside save.....',updatedData)
                if(err){
                    return res.status(500).send(err)
                }else{
                    if(!headersAgain==true){
                        headersAgain=true
                        return res.status(201).send(updatedData)
                    }
                }
            })
        })
     }
       
   })

【讨论】:

    【解决方案2】:

    是的,因为我们使用 PUT 方法传递数据。在您的情况下,您可以将要更新的数据作为对象数组发送。如果您使用 MongoDB 作为数据库,则可以使用 Update Array Operator 更新数据。

    我的建议: 问题是,前端没有什么可做的。如果您只需要更新单个记录,则将单个数据作为数组内的对象传递。如果要更新多条记录,请将每条记录作为数组内的对象传递给后端。

    在后端,我们可以使用 req.body.books(你从前端传递的对象的名称)接收数据。如果您使用的是 mongoDB,可以参考如何将数据存储在数组中的链接。

    【讨论】:

    • 感谢您的启发,我尝试了这个解决方案,发现它不是包裹在“req.body.books”中,而是将数组以 JSON 的形式包裹到“req.body”。但是感谢您告诉我们可以进行多次更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2021-01-30
    • 2020-04-02
    相关资源
    最近更新 更多