рднрд╛рдЧ 4. рдПрдХ REST API рдмрдирд╛рдирд╛: POST, PUT рдФрд░ DELETE рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдЖрдкрдиреЗ GET рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП API рдХреЛ рддрд░реНрдХ рдЬреЛрдбрд╝рд╛ рдерд╛ рдЬреЛ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рдерд╛ред рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдЖрдк POST, PUT рдФрд░ DELETE рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдЬреЛрдбрд╝рдХрд░ CRUD API рдХреА рдореВрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВрдЧреЗред
рд░реВрдЯрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдЬреЛрдбрд╝рдирд╛рд░реВрдЯрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдореМрдЬреВрджрд╛ рдорд╛рд░реНрдЧ (рд╡реИрдХрд▓реНрдкрд┐рдХ рдЖрдИрдбреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА HTTP рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде
рд╕реЗрд╡рд╛рдУрдВ / рд░рд╛рдКрдЯрд░ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди рд░реВрдЯрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ (рд▓рд╛рдЗрди 5-6) рдХреЛ рдмрджрд▓реЗрдВ:
router.route('/employees/:id?') .get(employees.get) .post(employees.post) .put(employees.put) .delete(employees.delete);
рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рд░реВрдЯрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдмреБрдирд┐рдпрд╛рджреА CRUD рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЪрд╛рд░ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп HTTP рддрд░реАрдХреЛрдВ рдХреЛ рд╕рд╣реА рдХрдВрдЯреНрд░реЛрд▓рд░ рд▓реЙрдЬрд┐рдХ рдореЗрдВ рдореИрдк рдХрд░рддреЗ рд╣реИрдВред
рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдгHTTP POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирдП рд╕рдВрд╕рд╛рдзрди (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд░реНрдордЪрд╛рд░реА рд░рд┐рдХреЙрд░реНрдб) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ HTTP рдЕрдиреБрд░реЛрдз рдХреЗ рд╢рд░реАрд░ рд╕реЗ рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХ рддрд░реНрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП,
рдирд┐рдпрдВрддреНрд░рдХреЛрдВ / рдХрд░реНрдордЪрд╛рд░реАред рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:
function getEmployeeFromRec(req) { const employee = { first_name: req.body.first_name, last_name: req.body.last_name, email: req.body.email, phone_number: req.body.phone_number, hire_date: req.body.hire_date, job_id: req.body.job_id, salary: req.body.salary, commission_pct: req.body.commission_pct, manager_id: req.body.manager_id, department_id: req.body.department_id }; return employee; } async function post(req, res, next) { try { let employee = getEmployeeFromRec(req); employee = await employees.create(employee); res.status(201).json(employee); } catch (err) { next(err); } } module.exports.post = post;
GetEmployeeFromRec рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЕрдиреБрд░реЛрдз рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдХрд░реНрдордЪрд╛рд░реА рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреЛрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд╣рд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ PUT рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдкреЛрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП getEmployeeFromRec рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдХрд░реНрдордЪрд╛рд░реА рдбреЗрдЯрд╛рдмреЗрд╕ API рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд░рд┐рдПрдЯ рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рдж, рдХрд░реНрдордЪрд╛рд░реА JSON (рдХрд░реНрдордЪрд╛рд░реА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдирдП рдореВрд▓реНрдп рд╕рд╣рд┐рдд) рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреЛрдб "201 рдХреНрд░рд┐рдПрдЯ" рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдкреАрдЖрдИ рдореЗрдВ рддрд░реНрдХ рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
Db_apis / рдХрд░реНрдордЪрд╛рд░реА .
js рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдиреАрдЪреЗ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВред
const createSql = `insert into employees ( first_name, last_name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id ) values ( :first_name, :last_name, :email, :phone_number, :hire_date, :job_id, :salary, :commission_pct, :manager_id, :department_id ) returning employee_id into :employee_id`; async function create(emp) { const employee = Object.assign({}, emp); employee.employee_id = { dir: oracledb.BIND_OUT, type: oracledb.NUMBER } const result = await database.simpleExecute(createSql, employee); employee.employee_id = result.outBinds.employee_id[0]; return employee; } module.exports.create = create;
рдЙрдкрд░реЛрдХреНрдд рддрд░реНрдХ рдЗрдиреНрд╕рд░реНрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рдХреНрд░рд╛рдЗрд╕реНрдЯрд╕реНрдХрд▓ рдШреЛрд╖рд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣
рдмрд╛рдЗрдВрдб рд╡реИрд░рд┐рдПрдмрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛
рд╣реИ , рди рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрдВрд╕рдВрдЯреНрд░реЗрд╢рди рдХрд╛, рдЬреЛ рдбрд╛рд▓реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдмрд╛рдЗрдВрдб рдЪрд░ рдХрд┐рддрдиреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдорд╡рд╕рд░рдг рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред
рдмрдирд╛рдПрдБ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░, рдХрд░реНрдордЪрд╛рд░реА рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ Object.assign рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдореНрдкрд╛рдпрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрд╢реЛрдзрди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдХрд░реНрдордЪрд╛рд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХрд░реНрдордЪрд╛рд░реА рдСрдмреНрдЬреЗрдХреНрдЯ ("рдЖрдЙрдЯ рдмрд╛рдЗрдВрдб" рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЗрд╕рдореЗрдВ SQL рдХрдерди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдмрд╛рдЗрдВрдб рдЪрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВред рдлрд┐рд░, simpleExecute рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдиреНрд╕рд░реНрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрдЙрдЯрдмрд╛рдЗрдВрдб рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд░реНрдордЪрд╛рд░реА. рдмреЗрд░реЛрдЬрдЧрд╛рд░реА_рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЪреВрдВрдХрд┐ oracledb рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд▓рд┐рдВрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
const oracledb = require('oracledb');
PUT рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдгрдореМрдЬреВрджрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PUT рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкреАрдпреВрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реЗ рд╕рдВрд╕рд╛рдзрди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдЖрдВрд╢рд┐рдХ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреИрдЯрдЪ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ)ред
рдирд┐рдпрдВрддреНрд░рдХреЛрдВ / рдХрд░реНрдордЪрд╛рд░реА.рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдкрд░ рд▓реМрдЯреЗрдВ рдФрд░ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝реЗрдВред
async function put(req, res, next) { try { let employee = getEmployeeFromRec(req); employee.employee_id = parseInt(req.params.id, 10); employee = await employees.update(employee); if (employee !== null) { res.status(200).json(employee); } else { res.status(404).end(); } } catch (err) { next(err); } } module.exports.put = put;
рдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди, рдХрд░реНрдордЪрд╛рд░реА рдирд╛рдо рдХреА рд╡рд╕реНрддреБ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП getEmployeeFromRec рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЖрдИрдбреА рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ URL рдореЗрдВ рдХрд░реНрдордЪрд╛рд░реА_рдкреНрд░реЙрдкрд░реНрдЯреА рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдлрд┐рд░ рдХрд░реНрдордЪрд╛рд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдкреАрдЖрдИ рдЕрдкрдбреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИред
рдбреЗрдЯрд╛рдмреЗрд╕ API рдореЗрдВ рдЕрдкрдбреЗрдЯ рд▓реЙрдЬрд┐рдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП,
db_apis / рдХрд░реНрдордЪрд╛рд░реА .
js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВред
const updateSql = `update employees set first_name = :first_name, last_name = :last_name, email = :email, phone_number = :phone_number, hire_date = :hire_date, job_id = :job_id, salary = :salary, commission_pct = :commission_pct, manager_id = :manager_id, department_id = :department_id where employee_id = :employee_id`; async function update(emp) { const employee = Object.assign({}, emp); const result = await database.simpleExecute(updateSql, employee); if (result.rowsAffected && result.rowsAffected === 1) { return employee; } else { return null; } } module.exports.update = update;
рдЕрджреНрдпрддрди рддрд░реНрдХ рд╕реГрдЬрди рддрд░реНрдХ рдХреЗ рд╕рдорд╛рди рд╣реИред SQL рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯ рдХрд┐рдП рдЧрдП рдбрд╛рдпрдиреЗрдорд┐рдХ рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП simpleExecute рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж)ред result.rowsAffected рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдкрдбреЗрдЯ рд╕рдлрд▓ рдерд╛ рдФрд░ рд╕рд╣реА рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред
DELETE рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдгрдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ DELETE рд╣реИ, рдЬреЛ, рдЕрдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред
рдирд┐рдпрдВрддреНрд░рдХреЛрдВ / рдХрд░реНрдордЪрд╛рд░реА.рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ
ред async function del(req, res, next) { try { const id = parseInt(req.params.id, 10); const success = await employees.delete(id); if (success) { res.status(204).end(); } else { res.status(404).end(); } } catch (err) { next(err); } } module.exports.delete = del;
рдпрджрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рд╣рдЯрд╛рдПрдВ" рдирд╛рдордХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЬрди рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, "рдбреЗрд▓" рдирд╛рдордХ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ "рдбрд┐рд▓реАрдЯ" рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдкрдХреЛ рддрд░реНрдХ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрд╕ HTTP рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХреЛрдИ рдирд┐рдХрд╛рдп рдирд╣реАрдВ рд╣реИ, рдорд╛рд░реНрдЧ рдкрде рдореЗрдВ рдХреЗрд╡рд▓ рдЖрдИрдбреА рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдерд┐рддрд┐ рдХреЛрдб "204 рдХреЛрдИ рд╕рд╛рдордЧреНрд░реА" рдЕрдХреНрд╕рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдкрд░ DELETE рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдбреЗрдЯрд╛рдмреЗрд╕ рддрд░реНрдХ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
db_apis / рдХрд░реНрдордЪрд╛рд░реА .
js рдлрд╝рд╛рдЗрд▓ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝реЗрдВред
const deleteSql = `begin delete from job_history where employee_id = :employee_id; delete from employees where employee_id = :employee_id; :rowcount := sql%rowcount; end;` async function del(id) { const binds = { employee_id: id, rowcount: { dir: oracledb.BIND_OUT, type: oracledb.NUMBER } } const result = await database.simpleExecute(deleteSql, binds); return result.outBinds.rowcount === 1; } module.exports.delete = del;
рдХреНрдпреЛрдВрдХрд┐ JOB_HISTORY рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рдмрд╛рдзрд╛ рд╣реИ рдЬреЛ EMPLOYEES рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреА рд╣реИ, рдПрдХ рд╕рд╛рдзрд╛рд░рдг PL / SQL рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╣реА рдЪрдХреНрд░ рдореЗрдВ рджреЛрдиреЛрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкрд╛рд░реНрд╕рд┐рдВрдЧ JSON рдЕрдиреБрд░реЛрдзрдпрджрд┐ рдЖрдк рдирд┐рдпрдВрддреНрд░рдХреЛрдВ / рдХрд░реНрдордЪрд╛рд░реА.js рдореЗрдВ getEmployeeFromRec рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЕрдиреБрд░реЛрдз рдмреЙрдбреА рдкреНрд░реЙрдкрд░реНрдЯреА рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рдпрд╣ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рд╕реЗ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдЖрдк рдЬрд┐рд╕ API рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ POST рдФрд░ PUT рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдЬрд╕рди рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд╛ рдХрдВрдЯреЗрдВрдЯ-рдЯрд╛рдЗрдк рд╣реЗрдбрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рдкрддрд╛ рдЪрд▓реЗ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдмреЙрдбреА рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдк рдПрдХреНрд╕рдкреНрд░реЗрд╕.рдЬреЙрди рдмрд┐рд▓реНрдЯ-рдЗрди рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдРрд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХреЗред
рд╕реЗрд╡рд╛рдУрдВ / рд╡реЗрдм-server.js рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ app.use рдХреЙрд▓ рдХреЗ рдареАрдХ рдиреАрдЪреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдЕрдиреБрд░реЛрдз рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдореЙрд░реНрдЧрди рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдЬрдм JSON рдбреЗрдЯрд╛ рдХреЛ рдореВрд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЗрд╡рд▓ JSON рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдбреЗрдЯреНрд╕ JSON рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЖрдорддреМрд░ рдкрд░ ISO 8601 рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХреНрд╕рдкреНрд░реЗрд╕рд╡реЗ.рдЬреЙрди рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рджрд┐рдП рдЧрдП рд░рд┐рд╡рд╛рдЗрд╡рд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реЗрд╡рд╛рдУрдВ / рд╡реЗрдм-рд╕рд░реНрд╡рд░.рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝реЗрдВред
const iso8601RegExp = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z$/; function reviveJson(key, value) {
рдПрдкреАрдЖрдИ рдкрд░реАрдХреНрд╖рдгрдпрд╣ рдирдП CRUD рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ! рдЕрдм рддрдХ, рдЖрдкрдиреЗ API рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ POST, PUT рдФрд░ DELETE рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХрд░реНрд▓ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЖрднрд╛рд╕реА рдорд╢реАрди рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реБрд▓рдн рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк
Postman ,
Insomina (free) рдЬреИрд╕реЗ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдПрдХ рдФрд░ рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдВрдбреЛ рдЦреЛрд▓реЗрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдХрд░реНрдордЪрд╛рд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВред
curl -X "POST" "http://localhost:3000/api/employees" \ -i \ -H 'Content-Type: application/json' \ -d $'{ "first_name": "Dan", "last_name": "McGhan", "email": "dan@fakemail.com", "job_id": "IT_PROG", "hire_date": "2014-12-14T00:00:00.000Z", "phone_number": "123-321-1234" }'
рдпрджрд┐ рдЕрдиреБрд░реЛрдз рд╕рдлрд▓ рдерд╛, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд░реНрдордЪрд╛рд░реА_рдЖрдИрдбреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╛рд▓рд╛ рдХрд░реНрдордЪрд╛рд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, employee_id рдорд╛рди 227 рдерд╛ - рдЖрдкрдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реНрдордЪрд╛рд░реА_id рдорд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рдореНрди рдЖрджреЗрд╢реЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдорд╛рди рдХреЗ рд╕рд╛рде URL рдХреЗ рд▓рд┐рдП PUT рджрд░реНрдЬ рдХрд░реЗрдВред
curl -X "PUT" "http://localhost:3000/api/employees/227" \ -i \ -H 'Content-Type: application/json' \ -d $'{ "first_name": "Dan", "last_name": "McGhan", "email": "dan@fakemail.com", "job_id": "AD_PRES", "hire_date": "2014-12-14T00:00:00.000Z", "phone_number": "123-321-1234" }'
HR рд╕реНрдХреАрдорд╛ рдореЗрдВ UPDATE_JOB_HISTORY рдЯреНрд░рд┐рдЧрд░ рдПрдХ рдиреМрдХрд░реА рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ рдФрд░ JOB_HISTORY рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирдП рдХрд░реНрдордЪрд╛рд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХреЙрд░реНрдб рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдиреМрдХрд░реА рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдФрд░ рдХрд░реНрдордЪрд╛рд░реА рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБред
curl -i -X "DELETE" "http://localhost:3000/api/employees/227"
рдФрд░ рдЕрдм, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдм рдХреБрдЫ рд╣реИ, рдкреВрд░реНрдг CRUD рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛!
рдПрдкреАрдЖрдИ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рдЧрддрд┐ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред
рдЕрдВрддрд┐рдо рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ GET рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдкреЗрдЬреЗрд╢рди, рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдКрдВрдЧрд╛ред