在 NodeJS 中,如何使用 node-postgres 模块将 JSON 对象保存为文本?
Posted
技术标签:
【中文标题】在 NodeJS 中,如何使用 node-postgres 模块将 JSON 对象保存为文本?【英文标题】:In NodeJS how to save JSON object as text with node-postgres module? 【发布时间】:2014-08-21 00:27:30 【问题描述】:最后,我从 postgresql 9.1 前进到支持 JSON 数据类型的 postresql 9.3。然后同样的代码正常运行。
但是我认为我一开始想做的事情可以完成......如果有人知道我仍然想知道。
环境node v0.10.28pg v3.3.0postgresql 9.1
我收到了这个插入查询
INSERT INTO sessions(sid, user_id, session_object) VALUES ('id1', 1, '"id":"fX2HkXYLclB","data": testing"') RETURNING session_id
从 pgAdmin(或命令行)对其进行测试时,它可以正常工作,但是当我的应用程序尝试从 pg.client.query
运行它时,它会尝试将对象转换为保存“[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 上手动测试查询后,表显示这 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);
);
【问题讨论】:
这听起来像是obj.toString()
的问题。您没有在对象的任何地方使用toString()
是吗?我在这里看不到它,否则您的代码应该可以工作。
不。代码在这里进行了简化,但与原始版本非常相似。 JSON.stringify(session)
给我一个字符串,所以我不需要 session.toString()
什么都没有。
可以分享原代码吗?
你知道了,希望对你有帮助。
【参考方案1】:
node postgres 模块还有另一种形式的查询;其中第二个参数是一个对象数组。所以在你的情况下
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 注入攻击的额外好处。
【讨论】:
是的...我也尝试过,但仍然得到相同的结果。以上是关于在 NodeJS 中,如何使用 node-postgres 模块将 JSON 对象保存为文本?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 NodeJS、Mongoose 和 TypeScript 中使用日期和时间?