Joshua Swiss
Joshua Swiss

Reputation: 305

Can't send multiple objects in array via REST client (Insomnia)

I'm using Insomnia to test requests to my API. Can someone explain why the request in the first image works, but the second image only posts the first object in the array?

enter image description here

enter image description here

For reference, here's the array of objects I'm trying to post:

[{
    "period":5,
    "uploadDate":"2015-11-19T21:00:00.000Z",
    "transferCode":"23100","vendor":"Unity State",
    "voucherNumber": "0000047538",
    "description":"1003-1495 Condi Operating Oct                  ",
    "amount":7083

},
{
    "period":5,
    "uploadDate":"2015-11-19T21:00:00.000Z",
    "transferCode":"23100",
    "vendor":"Northern Bahr-el State",
    "voucherNumber":"0000047546",
    "description":"1003-1494 Condi Operating Oct                  ",
    "amount":7083

}]

As well as the code I'm using in Nodejs:

//transferController.js in Node
function createTransfer(request, response) {

    console.log('posting');
    console.log('body: ' + request.body);                         //TEST
    console.info("Body: " + JSON.stringify(request.body));        //TEST

    var transfer = new Transfer(request.body);

    transfer.save(function(error) {

       // console.log('transfer and transfer: ' + transfer);
       if(error) return response.json({ message: 'could not create transfer because ' + error });
       response.json({ transfer: transfer });
  });
}

Upvotes: 1

Views: 19229

Answers (1)

cviejo
cviejo

Reputation: 4398

Since you are posting an array of objects, you should iterate through them when saving to the db. Try this (using async.mapSeries):

var async = require("async");

function createTransfer(request, response) {

    async.mapSeries(request.body, function (item, cb) {

        var transfer = new Transfer(item);

        transfer.save(function(error){
            cb(error, transfer);
        });
    }, 
    function (error, transfers){

        response.json(error ? { message: "could not create because " + error } : transfers);
    });   
}

[EDIT]

Here's an example app using this code.

main.js

var express    = require("express");
var bodyParser = require("body-parser");
var mongoose   = require("mongoose");
var async      = require("async");
var Transfer   = require("./models/Transfer");

var app = express();
app.use(bodyParser.json());

mongoose.connect("mongodb://localhost/test");

//----------------------------------------------------
app.post('/', function (req, res) {

    async.mapSeries(req.body, function iterator(item, cb) {

        var transfer = new Transfer(item);
        transfer.save(function(error){
            cb(error, transfer);
        });
    }, 
    function done(error, transfers){
        res.json(error ? { message: "could not create transfer because " + error } : transfers);
  });
});


app.listen(3000);

Transfer.js

var mongoose = require('mongoose');

var TransferSchema = new mongoose.Schema({
    uploadDate    : Date,
    period        : Number,
    transferCode  : String,
    voucherNumber : String,
    vendor        : String,
    description   : String,
    amount        : Number
});

module.exports = mongoose.model('Transfer', TransferSchema);

Output (using insomnia)

[
    {
        "__v": 0,
        "period": 5,
        "uploadDate": "2015-11-19T21:00:00.000Z",
        "transferCode": "23100",
        "vendor": "Unity State",
        "voucherNumber": "0000047538",
        "description": "1003-1495 Condi Operating Oct                  ",
        "amount": 7083,
        "_id": "5697c87e0dbd4a7413000001"
    },
    {
        "__v": 0,
        "period": 5,
        "uploadDate": "2015-11-19T21:00:00.000Z",
        "transferCode": "23100",
        "vendor": "Northern Bahr-el State",
        "voucherNumber": "0000047546",
        "description": "1003-1494 Condi Operating Oct                  ",
        "amount": 7083,
        "_id": "5697c87e0dbd4a7413000002"
    }
]

Upvotes: 1

Related Questions