我正在开发一个REST API,使用Node/Express和PostgreSQL作为后端。一些用于向数据库插入数据的端点更复杂一些,因为它们在多个表中插入项。因此,我编写了存储过程或函数来 Package 所有语句。例如,一个存储过程可能看起来像:
CREATE OR REPLACE PROCEDURE add_doc(_type VARCHAR, _level SMALLINT, _items TEXT[], _verfied BOOLEAN[]) AS $$
DECLARE
…
BEGIN
INSERT INTO docs (...) VALUES (...) RETURNING id INTO new_doc_id;
FOR i IN 1..ARRAY_LENGTH(_items, 1) LOOP
INSERT INTO doc_items (...) VALUES (...);
END LOOP;
END $$ LANGUAGE plpgsql;
然后我有一些Node/Express代码,可能看起来像这样:
router.post('/', (req, res, next) => {
const query = {
text: 'CALL add_doc($1::VARCHAR, $2::SMALLINT, $3::TEXT[], $4::BOOLEAN[])',
values: [req.body.type, req.body.level, req.body.items, req.body.verified]
}
Postgres.getPool().query(query, (error, result) => {
if (error) {
console.log(error);
return res.status(500).send(error.message);
}
return res.status(200).send(result.rows[0]);
});
});
原则上,这工作得很好。然而,这当前假设有效数据被传递到API端点。因此,我希望包括完整性检查,并在数据不是无效时抛出错误。例如,我想确保数组_verified
至少包含一个TRUE
值,并且_items
和_verified
具有相同的长度,以及其他约束。
我现在想知道在哪里放置这些检查,在存储过程/函数或Node/Express代码中?我现在是怎么看的:
签入存储过程/函数
- PRO:数据约束检查尽可能接近数据;即使在API外部调用过程/函数,也会检查约束; Node/Express代码保持轻量级
- 缺点:PL/pgSQL不是很方便(例如,获取数组中某个值的出现次数相当麻烦)。
签入节点/Express
- 优点:JavaScript对大多数类型的检查需要更少的代码;更易于编写和维护
- CON:假设数据仅通过API调用插入、更新和删除
我肯定我忽略了一些需要考虑的问题。诚然,我也不知道什么可能是更可取的性能。
1条答案
按热度按时间8tntrjer1#
我会使用express-validator来检查您的输入是否正确,然后我会认为数据的检查必须尽可能接近数据库引擎所做的数据本身。不知道有没有用