我正在尝试通过Node.JS为Oracle表动态发出补丁请求
这是我的设置:
在router.js文件中,我有这个:
const express = require('express');
const router = new express.Router();
const employees = require('../controllers/employees.js');
const smiCats = require('../controllers/smi/smiCats.js');
const auth = require('../controllers/auth.js');
router.route('/login/:id?')
.post(auth.getToken);
router.route('/ams/:id?')
.get(auth.verifyToken, employees.get)
.post(auth.verifyToken, employees.post)
.put(auth.verifyToken, employees.put)
.delete(auth.verifyToken, employees.delete)
.patch(auth.verifyToken, employees.patch);
router.route('/smi/cats/:id?')
.get(auth.verifyToken, smiCats.get)
.post(auth.verifyToken, smiCats.post)
.put(auth.verifyToken, smiCats.put)
.patch(auth.verifyToken, smiCats.patch);
module.exports = router;
然后调用具有我的补丁功能并被清理的控制器。
//sanitizer
function sanitizeCats(req) {
const cats = {
cat_desc: req.body.cat_desc,
msg_for: req.body.msg_for,
msg_user_owner: req.body.msg_user_owner || 0,
msg_realtor_owner: req.body.msg_realtor_owner || 0
};
return cats;
}
async function patch(req, res, next) {
try {
let category = sanitizeCats(req);
category.cat_id = parseInt(req.params.id, 10);
const success = await smiCats.patch(category);
if (success) {
res.status(204).end();
} else {
res.status(404).end();
}
} catch (err) {
next(err);
}
}
module.exports.patch = patch;
执行后,它将调用我的db_api模块,该模块将组装sql语句
(下一个代码段来自我的问题,] >>
const database = require('../../services/database.js'); const oracledb = require('oracledb'); const patchSql = `BEGIN DECLARE BEGIN IF nvl(:cat_desc,'zzz') != 'zzz' THEN UPDATE smi_contact_cats SET cat_desc = :cat_desc WHERE cat_id = :cat_id; END IF; IF nvl(:msg_for,'zzz') != 'zzz' THEN UPDATE smi_contact_cats SET msg_for = :msg_for WHERE cat_id = :cat_id; END IF; IF nvl(:msg_user_owner,-1) > -1 THEN UPDATE smi_contact_cats SET msg_user_owner = :msg_user_owner WHERE cat_id = :cat_id; END IF; IF nvl(:msg_realtor_owner,-1) > -1 THEN UPDATE smi_contact_cats SET msg_realtor_owner = :msg_realtor_owner WHERE cat_id = :cat_id; END IF; :rowcount := sql%rowcount; END; END;`; async function patch(cats) { const category = Object.assign({}, cats); //add binds category.rowcount = { dir: oracledb.BIND_OUT, type: oracledb.NUMBER }; const result = await database.simpleExecute(patchSql, category); return result.outBinds.rowcount === 1; } module.exports.patch = patch;
然后这将调用数据库函数来实际执行和使用绑定变量组装sql:
const oracledb = require('oracledb'); const dbConfig = require('../config/database.js'); async function initialize() { const pool = await oracledb.createPool(dbConfig.beta); } module.exports.initialize = initialize; async function close() { await oracledb.getPool().close(); } module.exports.close = close; function simpleExecute(statement, binds = [], opts = {}) { return new Promise(async (resolve, reject) => { let conn; opts.outFormat = oracledb.OBJECT; opts.autoCommit = true; try { conn = await oracledb.getConnection(); const result = await conn.execute(statement, binds, opts); resolve(result); } catch (err) { reject(err); } finally { if (conn) { // conn assignment worked, need to close try { await conn.close(); } catch (err) { console.log(err); } } } }); } module.exports.simpleExecute = simpleExecute;
所以所有这些工作都有效...但是对于我来说,构建我的公司api不够动态。我如何在Node.JS中提出更动态的补丁请求,而不必键入每列并在其周围放一个nvl来检查它是否在那里。顺便说一句,如果没有更好的方法来动态清理,我也听不清,但是主要问题是如何更好地动态构建补丁请求。
我正在尝试通过Node.JS动态地对oracle表进行补丁请求,这是我的设置:在router.js文件中,我有这样的内容:const express = require('express'); const router = new express ....
当前代码是次优的,因为每个属性进行一次更新。这是一个更具动态性的解决方案...