如何在Node app中使用多和在哪里与knex?

时间:2019-08-22 22:49:47

标签: node.js postgresql knex.js pg

我正在尝试将多列作为参数传递以删除postgresql表中的一行,但是在第一个参数之后,所有其余参数均未定义 这是我正在使用knex ORM

的代码
const deleteDeltaTableData = (req, res, db_client) => {
  const { id, delta_type, action_type, delta_timestamp } = req.body
  console.log('id='+id);
  console.log('delta_type='+delta_type);
  onsole.log('action_type='+action_type);
  console.log('delta_timestamp='+delta_timestamp);

  db_client('delta')
    .where({id})
    .andWhere({delta_type})
    .andWhere({action_type})
    .andWhere({delta_timestamp})
  .del()
  .then(() => {
    res.json({delete: 'true'})
  })
  .catch(err => {
    console.log(err);
    res.status(400).json({dbError: 'db error'});
  });
}

现在我的console输出是这样:

id=f3si
delta_type=undefined
action_type=undefined
delta_timestamp=undefined
Error: Undefined binding(s) detected when compiling DEL query: delete from "delta" where "id" = ? and "delta_type" = ? and "action_type" = ? and "delta_timestamp" = ?

我在做什么错了?

在我的孩子中,这首先是我的客户端代码:

function onDeleteClick(id, delta_type, action_type, delta_timestamp) {
console.log(id, delta_type, action_type, delta_timestamp)
fetch('/api/delta', {
  method: 'delete',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    id,
    delta_type, action_type, delta_timestamp
  })
})
.then(response => response.json())
.then(row => {
  deleteItemFromState(id, delta_type, action_type, delta_timestamp)
})
.catch(err => console.log(err))
}

<TableCell>
   <IconButton onClick={() => onDeleteClick(row.id, row.delta_type, row.action_type, row.delta_timestamp)} aria-label="Delete">
       <DeleteIcon  />
   </IconButton>
 </TableCell>

这是我的父母React组件:

deleteItemFromState = (id,  delta_type, action_type, delta_timestamp) => {
const updatedRows = this.state.rows.filter(
  row => 
    row.id !== id 
    && row.delta_type !== delta_type 
    && row.action_type !== action_type
    && row.delta_timestamp !== delta_timestamp
);
this.setState({ rows: updatedRows });
};

render() {
const { rows } = this.state;

return (
  <DeltaTable
    rows={rows}
    deleteItemFromState={this.deleteItemFromState }
  />
);
}

2 个答案:

答案 0 :(得分:0)

根据您的控制台日志,req.body不包含delta_type,action_type或delta_timestamp的值。您的knex代码没有任何问题-只是您正在向其提供未定义的值。无论请求数据来自何处,问题都存在于上游。

答案 1 :(得分:0)

我看不到纽结有任何问题。我相信您没有将正确的值发送到控制器。我会检查您的请求数据和正文,并确保您正在传递要存储的数据。