Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何修复Postgres错误:bind消息提供了8个参数,但准备好了语句&引用;需要6个_Node.js_Postgresql_Vue.js_Axios - Fatal编程技术网

Node.js 如何修复Postgres错误:bind消息提供了8个参数,但准备好了语句&引用;需要6个

Node.js 如何修复Postgres错误:bind消息提供了8个参数,但准备好了语句&引用;需要6个,node.js,postgresql,vue.js,axios,Node.js,Postgresql,Vue.js,Axios,我在后台准备我的模型 我有一个包含id和col:t1的tab1,我想先插入到那个表中,然后得到它的id,并将它和其他col一起插入到我的tab2中。所以id_tab2是我从tab1中得到的外键(tab2有自己的id of c,而不是id_tab2) 这是我声明查询的文件: const createUser=(req, res, next) => { let con=req.con let { t1,x1,x2,x3,x4,x5,x6,id_tab2 } = req.body; co

我在后台准备我的模型 我有一个包含id和col:t1的tab1,我想先插入到那个表中,然后得到它的id,并将它和其他col一起插入到我的tab2中。所以id_tab2是我从tab1中得到的外键(tab2有自己的id of c,而不是id_tab2) 这是我声明查询的文件:

const createUser=(req, res, next) => {
  let con=req.con
let { t1,x1,x2,x3,x4,x5,x6,id_tab2 } = req.body;
  con.query(
`SELECT * FROM users
  WHERE x3 = $1`,
[x3],
(err, results) => {
  if (err) {
    console.log(err);
    res.status(404).json({message: err});
  }

  if (results.rows.length > 0) {
     res.status(404).json({message: "user exists"});
  } else {

  const hashedPassword = bcrypt.hashSync(x4, parseInt(process.env.BCRYPT_ROUNDS));
  con.query('WITH ins1 AS ( INSERT INTO tab1(t1)  VALUES ($1) RETURNING id AS id_tab2), ins2 AS ( INSERT INTO tab2 (x1,x2,x3,x4,x5,x6,id_tab2)  SELECT $1,$2,$3,$4,$5,$6,id_tab2 FROM ins1  RETURNING id,x1, x2,x3, x4, x5,x6,id_tab2)  SELECT x1, x2,x3, x4, x5,x6,id_tab2 from ins2',
  [t1,x1, x2,x3, x4,hashedPassword,x6,id_tab2 ],
      (err, results) => {
        if (err) {
          console.log(err);
          res.status(404).json( {message: err});
        }
        else
        {res.status(200).send(results.rows[0])}
      }
    );
  }
}
 );
}
当我从Vue前端调用api时: 以下是文件:

axios.post("/accnt/register",data)
  .then((res)=>{
   this.$emit("addedUser",res.data)
    message.success(`user added`)
  })
.catch((e)=>{
    message.warning(e.response.data.message)
  }) 
    })
    .catch(error => {
      console.log('error', error);
    });
我在服务器端返回此错误:

error: bind message supplies 8 parameters, but prepared statement "" requires 6
.
.
.
.
.
routine: 'exec_bind_message'

我不知道我在这个查询中做错了什么,知道如何解决这个问题吗?

您的语句只有6个占位符,但您的调用有8个参数。错误消息似乎不言自明


你没有说清楚你想在这里发生什么,看,我们不得不猜测你的意图。您使用了两次
$1
,但是根据使用它的列的名称,您可能应该重新编号为$1到$7,并且每个列只使用一次,而不是$1到$6其中一个列使用两次。而且,看起来id_tab2应该是由数据库从序列生成的,但是为什么要尝试为它传递一个值呢?如果您对参数重新编号,并从传入参数列表中删除id_tab2,则两者都将为7。

我实际上将代码更改为此,并且由于@jjane的回答,它工作正常。我对参数有了更多的了解,并重点关注它们:

const createUser=(req, res, next) => {
let con=req.con
let { t1,x1,x2,x3,x4,x5,x6 } = req.body; <---deleted id_tab2
  con.query(
`SELECT * FROM users
  WHERE x3 = $1`,
 [x3],
(err, results) => {
if (err) {
console.log(err);
res.status(404).json({message: err});
 }

  if (results.rows.length > 0) {
 res.status(404).json({message: "user exists"});
  } else {

 const hashedPassword = bcrypt.hashSync(x4, 
  parseInt(process.env.BCRYPT_ROUNDS));
con.query('WITH ins1 AS ( INSERT INTO tab1(t1)  VALUES ($1) RETURNING id AS 
 id_tab2), ins2 AS ( INSERT INTO tab2 (x1,x2,x3,x4,x5,x6,id_tab2)  SELECT 
 $2,$3,$4,$5,$6,$7,id_tab2 FROM ins1  RETURNING id,x1, x2,x3, x4, 
 x5,x6,id_tab2)  
 SELECT x1, x2,x3, x4, x5,x6,id_tab2 from ins2',
 [t1,x1, x2,x3, x4,hashedPassword,x6], <---deleted id_tab2
  (err, results) => {
    if (err) {
      console.log(err);
      res.status(404).json( {message: err});
    }
    else
    {res.status(200).send(results.rows[0])}
     }
   );
  }
 }
);
}
const createUser=(请求、恢复、下一步)=>{
设con=req.con
设{t1,x1,x2,x3,x4,x5,x6}=req.body{
如果(错误){
控制台日志(err);
res.status(404).json({message:err});
}
如果(results.rows.length>0){
json({message:“user exists”});
}否则{
常量hashedPassword=bcrypt.hashSync(x4,
parseInt(process.env.BCRYPT_ROUNDS));
con.query('带ins1作为(插入到tab1(t1)值($1)中)返回id作为
id_表2),ins2 AS(插入表2(x1,x2,x3,x4,x5,x6,id_表2)选择
$2、$3、$4、$5、$6、$7,从ins1返回id,x1、x2、x3、x4,
x5、x6、id_表2)
从ins2'中选择x1、x2、x3、x4、x5、x6、id_tab2,
[t1,x1,x2,x3,x4,哈希密码,x6]{
如果(错误){
控制台日志(err);
res.status(404).json({message:err});
}
其他的
{res.status(200).send(results.rows[0])}
}
);
}
}
);
}

实际上我有一个表单,我应该在其中填写输入:第一个输入属于tab1(列不在tab2中),然后其他输入属于tab2,我试图做的是当我提交表单时,我想从tab2中获取字段,tab1的字段具有相同的id,因此,像tab1中的这个id一样,是填充formi其余部分的id。我在pgadmin4中尝试了这个查询。它工作正常。我正确地将数据插入两个表中。您在pgadmin4中是如何做到的?我不相信它提供了预先准备好的声明。我没有使用$obvly,我输入了真实的数据,现在我按照你告诉我的做了,将$2改为$8($1为第1个值)。问题是现在表单正在提交,我的tab1是沿着tab2填写的,但在我的id_tab2列中,我得到的是null,而不是tab1的id