Express+PostgreSQL后端:数据校验逻辑应置于何处?
问题:REST API数据校验逻辑的放置选择(Node/Express + PostgreSQL)
我正在用Node/Express搭配PostgreSQL开发REST API,部分插入数据的端点需要往多张表写入数据,因此用存储过程封装了所有SQL操作。以下是存储过程和Express代码示例:
存储过程示例
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;
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长度相同等约束。我纠结于将这些校验逻辑放在存储过程/函数还是Express代码中,自己梳理的优缺点如下:
放在存储过程/函数中
- 优点:校验逻辑离数据源最近,即使绕过API直接调用存储过程也会触发校验;Express代码更轻量化
- 缺点:用PL/pgSQL编写校验不够便捷,例如统计数组中特定值的出现次数较繁琐
放在Express代码中
- 优点:用JavaScript编写校验代码量更少,更易编写和维护
- 缺点:仅能保证通过API操作数据时的校验,无法覆盖其他数据操作场景(如直接操作数据库的情况)
我肯定还遗漏了部分考量因素,同时也不清楚两种方案在性能上的优劣,希望得到解答。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

