如何在Node.js(express)上返回由{}而不是包围的json返回使用knex和postgresql的查询结果

如果我做一个curl请求到我的node.js(EXPRESS)API curl http://127.0.0.1:3000/api/events/user/id/1我得到这个结果:

 [{"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"}] 

我需要输出被大括号包围,如:

  {{"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"}} 

我的模型“事件”文件是这样的查询,然后返回结果:

 var express = require('express'); var router = express.Router(); var Promise = require("bluebird"); var connectionString = 'postgres://postgres:postgres@localhost: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; } 

和我的路由器文件,它调用模型文件函数getUserEvents,是这样的:

 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 

我的问题是,如何发送包围{}而不是[]的json对象列表正在返回? 非常感谢你

编辑:这解决了我的问题,最后的格式是{“rows”:[{row1},{row2}等]}

 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; } 

你的api请求正在返回一个对象数组

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

你可以像这样在一个对象中嵌套数组

 newObj = { nestedarray: result } 

或者您可以将对象作为单独的值返回

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

但是所有对象都需要一个关键值对。

请注意,JavaScript中的数组实际上是一种专用types的对象,它仍然使用属性名称,而这些属性名称恰巧是整数,但是已经过优化以允许特定的方法。

所以在你的情况下:

 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); }); }); 

请注意,在这两个选项中,您不会因为不可能而以您想要的格式结束,但是两个选项都可以排除数组语法。

假设你想分别处理每个对象,你可以使用:

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

这将返回,例如你提供:

 {"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"} 

注意:{{stuff:1}},如你所build议的所需输出,是不是有效的JSON。

在JSON中, []括号包围数组。 你的查询返回一个数组,并在你的行中return res.json(result)结果variables是一个数组。 让它返回一个单一的对象,而不是一个数组, []将消失。 如果您希望查询包含多个结果,但仍不想要数组,请将数组{newResult: result}另一个对象,如{newResult: result}然后返回。