如何在节点pg中使用json参数调用Postgres 9.6函数

时间:2018-10-01 15:57:45

标签: node.js postgresql function

我对此感到困惑,谢谢您的时间,我试图调用一个接收json数组作为参数的postgres函数,并在执行查询时得到以下错误:

  

错误:绑定消息提供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 :(得分:1)

我认为问题在于您如何调用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等...

答案 1 :(得分:0)

最终的工作功能是:

  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);
  });
});