В NodeJS как сохранить объект JSON как текст с помощью модуля node-postgres?
Наконец, я перехожу от postgresql 9.1 к postresql 9.3, который поддерживает тип данных JSON. Тогда тот же код функционирует правильно.
Однако я думаю, что то, что я хочу сделать в первую очередь, может быть сделано... если кто-то знает, как я все еще хочу знать.
Enviroment
узел 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 (или из командной строки) он работает нормально, но когда мое приложение пытается запустить его из pg.client.query
он пытается превратить объект в строку, сохраняя "[объект объекта]". Вот код узла:
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);
}
});
}
1 ответ
Модуль postgres узла имеет другую форму запроса; где 2-й параметр - это массив объектов. Так что в вашем случае
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-инъекций.