在NodeJS中如何将JSON对象保存为带有node-postgres模块的文本?

最后,我从postgresql 9.1前进到支持JSON数据types的postresql 9.3。 然后相同的代码正常工作。

但是,我认为,我想要做的第一个地方可以做…如果有人知道我还是想知道。


环境
节点v0.10.28
pg v3.3.0
postgresql 9.1

我有这个插入查询

INSERT INTO sessions(sid, user_id, session_object) VALUES ('id1', 1, '{"id":"fX2HkXYLclB","data": testing"}') RETURNING session_id 

当从pgAdmin(或命令行)testing它时,它工作正常,但是当我的应用程序尝试从pg.client.query运行时,它尝试将对象作为string保存“[object object]”。 这是节点代码:

 var session = {"id":"fX2HkXYLclB","data": "testing"}; var sql = 'INSERT INTO sessions(sid, user_id, session_object) VALUES (\'id1\', ' + ' 1, \''+JSON.stringify(session)+'\' ) RETURNING session_id'; console.log(sql); client.query(sql, function(err, info) { if(err) { return addSessionCB(err, null); } return addSessionCB(null, info.rows[0].session_id); }); 

运行应用程序并在pg_admin上手动testing查询后,表中显示了这2个结果。

  session_id | sid | user_id | session_object | active ------------+-------------+---------+---------------------------------------+--------- 1 | fX2HkXYLclB | 1 | [object Object] | t 2 | fX2HkXYLclB | 1 | {"id":"fX2HkXYLclB","data": "testing"}| t (2 filas) 

所以,问题是什么即时通讯pg.query做错了?


添加原始代码,之前的代码被简化为可读性。

 function addSession(session, addSessionCB) { log.log('debug', '[PSQL]Add new session on DB. \nsession: '+ session.id + '\nuser:'+ session.data.user); function executeAddSessionQuery(user_id){ var sql = 'INSERT INTO sessions(sid, user_id, session_object) VALUES (\'' + session.id + '\', '+user_id+', \''+JSON.stringify(session)+'\' ) ' + 'RETURNING session_id'; log.log('debug', '[PSQL]Adding session: '+session.id+' for user_id: '+ user_id+'\nSQL: '+sql); client.query(sql, function(err, info) { if(err) { log.log('debug', '[PSQL]Error adding new session. \n'+err); return addSessionCB(err, null); } return addSessionCB(null, info.rows[0].session_id); }); }; //to save session we need to know user id getUserByName({name: session.data.user}, function getUserByNameCB(err, user_result){ if(err || !user_result){ //if error or not result we try to save new user log.log('debug', '[PSQL]Associated user not found. Creating a new ' + 'user entry. '); addUser({name: session.data.user}, function addUserCB(err, newUserID){ if(err){ log.log('warn', '[PSQL]Session user didn\'t exists and cannot be ' + 'added to DB'); return addSessionCB(err, null); } executeAddSessionQuery(newUserID); }); } else { //if the user exist we use his id. executeAddSessionQuery(user_result.user_id); } }); } 

节点postgres模块有另一种forms的查询 ; 第二个参数是一个对象数组。 所以在你的情况

 var sql = 'INSERT INTO sessions(sid,user_id,session_object) VALUES ($1,$2,$3) RETURNING session_id'; var values = [id1,1,JSON.stringify(session)]; 

然后跟着那个

 client.query(sql,values,function(err,info) { ... 

这也有防范SQL注入攻击的好处。