2016-07-23 13 views
2

zurück, wenn ich eine Curl-Anfrage an meine Node.js (EXPRESS) API curl mache http://127.0.0.1:3000/api/events/user/id/1 ich dieses Ergebnis:Wie gebe ich einen JSON umgeben von {} anstelle von [] auf Node.js (express) zurück und gebe ein Ergebnis einer Abfrage mit knex und postgresql

[{"id":"1","name":"casamiento 1","description":"el casamiento del tio claudio","mode_id":1,"initial_date":"2016-05-28T22:14:57.000Z","end_date":"2016-05-28T22:14:58.000Z","state_id":1,"user_id":"1","location":"0101000020E61000000000000000805BC00000000000003E40"},{"id":"2","name":"casamiento 2","description":"el casamiento del tio claudio 2","mode_id":1,"initial_date":"2016-05-28T22:14:57.000Z","end_date":"2016-05-28T22:14:58.000Z","state_id":1,"user_id":"1","location":"0101000020E61000000000000000405BC00000000000003D40"},{"id":"3","name":"fiesta del sandwich de miga","description":"Nos juntamos a comer sandwiches de miga hasta reventar","mode_id":1,"initial_date":"2016-05-28T22:15:58.000Z","end_date":"2016-05-28T22:15:58.000Z","state_id":1,"user_id":"1","location":"0101000020E610000000000000000000000000000000804840"}] 

und ich brauche die Ausgabe von geschweiften Klammern wie umgeben zu sein:

{{"id":"1","name":"casamiento 1","description":"el casamiento del tio claudio","mode_id":1,"initial_date":"2016-05-28T22:14:57.000Z","end_date":"2016-05-28T22:14:58.000Z","state_id":1,"user_id":"1","location":"0101000020E61000000000000000805BC00000000000003E40"},{"id":"2","name":"casamiento 2","description":"el casamiento del tio claudio 2","mode_id":1,"initial_date":"2016-05-28T22:14:57.000Z","end_date":"2016-05-28T22:14:58.000Z","state_id":1,"user_id":"1","location":"0101000020E61000000000000000405BC00000000000003D40"},{"id":"3","name":"fiesta del sandwich de miga","description":"Nos juntamos a comer sandwiches de miga hasta reventar","mode_id":1,"initial_date":"2016-05-28T22:15:58.000Z","end_date":"2016-05-28T22:15:58.000Z","state_id":1,"user_id":"1","location":"0101000020E610000000000000000000000000000000804840"}} 

Mein Modell „Ereignis“ Datei wie diese ist, die die Abfrage macht Knex und dann die Ergebnisse zurücksenden:

var express = require('express'); 
var router = express.Router(); 
var Promise = require("bluebird"); 
var connectionString = 'postgres://postgres:[email protected]:5432/flock'; 
var knex = require('knex')({ 
    client: 'pg', 
    connection: connectionString, 
    searchPath: 'knex,public' 
}); 

//Get all events from a particular user 
exports.getUserEvents=function(id_user){ 



    console.log("Retrieving data from id_user: "+id_user); 

    var promise1 = Promise.try(function() { 
    return knex('events') 
     .select('*') 
     .where('user_id', id_user); 
    }); 

    var promise2=promise1.then(function (rows) { // this creates a new promise, and the promise created here is what gets returned to the caller 
     console.log('Returning '+rows.length+' rows from the user with id '+id_user); 
     return rows; 

    }); 

    return promise2; 
} 

und meinem Router-Datei, die die Modelldatei Funktion getUserEvents nennt, ist wie folgt:

var express = require('express'); 
var router = express.Router(); 
var Event=require('../models/event'); 


//get all events from a user 

router.get('/user/id/:id_user', function(req, res, next) { 

    var id_user= req.params.id_user; 

    var promise = Event.getUserEvents(id_user); 

    promise.then(function (result) { 
    console.log('Sending response'); 
    return res.json(result); //<---this line builds the JSON response 
    }); 

    promise.catch(function (err) { 


    return res.sendStatus(500); 

    }); 

}); 




module.exports = router 

Meine Frage ist: Wie kann ich die json Objektliste durch {} und nicht von [] umgeben schicken wie kommt jetzt zurück ?. Vielen Dank

EDIT: Dies löste mein Problem ist das endgültige Format { "Zeilen": [{row1}, {row2}, etc]}

exports.getUserEvents=function(id_user){ 



    console.log("Retrieving data from id_user: "+id_user); 

    var promise1 = Promise.try(function() { 
    return knex('events') 
     .select('*') 
     .where('user_id', id_user); 
    }); 

    var promise2=promise1.then(function (rows) { // this creates a new promise, and the promise created here is what gets returned to the caller 
     console.log('Returning '+rows.length+' events from the user with id '+id_user); 
     return {rows};//<----This solved the issue 

    }); 

    return promise2; } 
+0

Warum brauchen Sie diese genaue Ausgabe (das ist nicht gültig)? Könnten Sie auch beantworten, was Sie diesem Output geben werden? Warum ist ein Array [{}, {}] oder ein Array-Objekt {1: {}, 2: {}} nicht geeignet? – iovoid

Antwort

2

Ihre api Anfrage zurückkehrt ein Array von Objekten

arrayOfObjects = [ 
    {objkey: objvalue}, 
    {objkey: objvalue} 
] 

Sie könnten Nest das Array in einem Objekt wie dieses

newObj = { 
    nestedarray: result 
} 

Oder Sie könnten die Objekte als einzelne Werte zurückgeben

newObj = { 
    1: result[0], 
    2: result[1], 
    3: result[2] 
} 

Aber alle Objekte benötigen ein Schlüsselwertpaar.

Beachten Sie, dass ein Array in Javascript eigentlich ein spezialisierter Objekttyp ist, der immer noch Eigenschaftsnamen verwendet, die zwar ganze Zahlen sind, aber für spezielle Methoden optimiert sind.

So in Ihrem Fall:

var express = require('express'); 
var router = express.Router(); 
var Event=require('../models/event'); 


//get all events from a user 

router.get('/user/id/:id_user', function(req, res, next) { 

    var id_user= req.params.id_user; 

    var promise = Event.getUserEvents(id_user); 

    promise.then(function (result) { 
    console.log('Sending response'); 

    // Option One 
    var newObj = { 
     nestedarray: result 
    } 

    // Option Two 
    var newObj = {} 
    response.forEach(function(elem, index) { 
     newObj[index] = elem; 
    }); 

    return res.json(newObj); //<---this line builds the JSON response 
}); 

    promise.catch(function (err) { 

     return res.sendStatus(500); 

    }); 
}); 

Beachten Sie, dass Sie in den beiden Optionen nicht mit dem Format am Ende Sie wollen einfach, weil es nicht möglich ist, aber entweder Option wird der Array-Syntax befreien.

+0

Danke, aber könnten Sie in diesem speziellen Fall einige Code-Spezifikationen geben, wie Sie das tun? ... Ich verstehe, was Sie sagen, aber ich muss die Implementierung kennen, nicht die theoretische Seite der Sache ... .Cause Ich benutze diese Knex-Bibliothek für Anfragen an Postgres-DB und ich weiß nicht, wie man Dinge in diesem Format zurückgibt .... Ich möchte nur das Format {{object1}, {object2}, {object3}} – Juan

+0

ich meine, ich don'twant das Format {[ {object1}, { object2} ] } das ist, was Sie vorschlagen, es Einwickeln mit {} .... nur {{ }, {}, {}} Option – Juan

+0

Option zwei gibt Ihnen ein Objekt: {1: {}, 2: {} ...} – alexi2

0

asuming wollen Sie jedes Objekt verarbeiten individuell können Sie:

for (i in result){ 
    console.log(result[i]); 
} 

, die zurückkehren würde, für das Beispiel, das Sie zur Verfügung gestellt:

{"id":"1","name":"casamiento 1","description":"el casamiento del tio claudio","mode_id":1,"initial_date":"2016-05-28T22:14:57.000Z","end_date":"2016-05-28T22:14:58.000Z","state_id":1,"user_id":"1","location":"0101000020E61000000000000000805BC00000000000003E40"} 
and 
{"id":"2","name":"casamiento 2","description":"el casamiento del tio claudio 2","mode_id":1,"initial_date":"2016-05-28T22:14:57.000Z","end_date":"2016-05-28T22:14:58.000Z","state_id":1,"user_id":"1","location":"0101000020E61000000000000000405BC00000000000003D40"} 
and 
{"id":"3","name":"fiesta del sandwich de miga","description":"Nos juntamos a comer sandwiches de miga hasta reventar","mode_id":1,"initial_date":"2016-05-28T22:15:58.000Z","end_date":"2016-05-28T22:15:58.000Z","state_id":1,"user_id":"1","location":"0101000020E610000000000000000000000000000000804840"} 

Hinweis: {{stuff: 1}}, Wie Sie als gewünschte Ausgabe vorgeschlagen haben, ist JSON nicht gültig.

0

In JSON sind die [] Klammern Surround-Arrays. Ihre Abfrage gibt ein Array zurück, und in Ihrer Zeile return res.json(result) ist die Ergebnisvariable ein Array. Lassen Sie es ein einzelnes Objekt anstelle eines Arrays zurückgeben und die [] wird weggehen. Wenn Sie erwarten, dass Ihre Abfrage mehrere Ergebnisse enthält und Sie dennoch kein Array möchten, wickeln Sie das Array in ein anderes Objekt wie {newResult: result} und geben Sie stattdessen das Array zurück.

+0

danke, Sie antworteten war auch hilfreich, aber Alexi2 versuchte, mir bewusst, dass was ich wollte, war nicht möglich und gab gültige Alternativen, damit ich seine Antwort akzeptiere, aber ich endete Tun Sie dies ....... Vielen Dank !! – Juan