如何在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}
然后返回。