Как вызвать функцию postgres 9.6 с параметром json в узле pg - PullRequest
0 голосов
/ 01 октября 2018

я застрял с этим, спасибо за ваше время, я пытаюсь вызвать функцию postgres, получая массив json в качестве параметра, я получаю следующую ошибку при выполнении запроса:

ошибка: связатьсообщение содержит 3 параметра, но подготовленное утверждение "" требует 1

, я использую pg для соединения запрос, это мой код

     create() {
    var datajson=[];
    var data=this.params.body;   

    if (Object.keys(data).length>1)
    {
      for (var i=0; i<Object.keys(data).length; i++)
      {  
        datajson.push(data[i]);
        console.log(JSON.stringify(data[i]));
      }
    } 



var _this=this;




pg.connect(Nodal.my.Config.db.main, function(err, client, done) {
  console.log('2');
  if (err) {
      console.log('3');
  }

  console.log("llamoexec"+JSON.stringify(datajson));
  var query = {
    // give the query a unique name
    text: 'SELECT setProduct($1)',
    values:  datajson
  }

  client.query(query, function(err, result) {
      console.log('4');
      if (err) {
          console.log('5'+err);
      }
      done();
  });
});



  }

Большое спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Конечная рабочая функция:

  create() {
    var datajson=[];
    var data=this.params.body;   

    if (Object.keys(data).length>=1)
    {
      for (var i=0; i<Object.keys(data).length; i++)
      {  
        datajson.push(data[i]);
        console.log(JSON.stringify(data[i]));
      }
    } 

var _this=this;

pg.connect(Nodal.my.Config.db.main, function(err, client, done) {
  console.log('2');
  if (err) {
      console.log('3');
  }

  console.log("llamoexec"+JSON.stringify(datajson));
  var query = {
    // give the query a unique name
    text: 'SELECT setProduct($1)',
    values:  datajson
  }

  client.query('SELECT setProduct($1)',[JSON.stringify(datajson)], function(err, result) {
      console.log('4');
      if (err) {
          console.log('5'+err.message);
      }
      done();
      _this.respond(result);
  });
});
0 голосов
/ 03 октября 2018

Я думаю, проблема в том, как вы вызываете client.query.Я не знаком с методом, который вы используете, но вот как я обычно его использую:

let params = [ "param1", ["param2"] ]; /* array of params */
let query = "select someFunction($1::text, $2::text[])";
client.query( query, params, function (error, result) {
    if (error) { /* handle */ }
    else { /* do work */ }
});

В вашем случае предполагается, что datajson предназначен для массива строк:

let params = [ datajson ];
let query = "select setProduct($1::text[])";
/* note in your case if you had intended to send in a json string as a string then instead:
let query = select setProduct($1::text);
or if you had intended to send in as json:
let query = select setProduct($1::json);
*/
client.query (query, params, function(error, result){
    if (error) { /* handle it */ }
    else {
        console.log(result);
    }
});

Как вы можете видеть, params должен быть массивом, на который в строке выбора ссылается его порядковый номер: $ 1, $ 2 и т. Д. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...