เป็นการดีที่สุดที่จะไม่ใช้เลย! ฉันอธิบายและนั่นคือสิ่งที่ฉันอธิบายด้วย
ฟังก์ชันถัดไป () ที่สามารถมีชื่อใด ๆ และตามระเบียบได้รับการตั้งค่าเป็นถัดไป มันเกี่ยวข้องกับการดำเนินการทางอ้อม (PUT, GET, DELETE, ... ) ซึ่งโดยทั่วไปแล้วจะดำเนินการบนทรัพยากร URI เดียวกันเช่น/ user /: id
app.get('/user/:id', function (req,res,next)...)
app.put('/user/:id', function (req,res,next)...)
app.delete('/user/:id', function (req,res,next)...)
app.post('/user/', function ()...)
ตอนนี้ถ้าคุณดูที่ app.get, app.put และ app.delete ให้ใช้ uri (/ user /: id) เดียวกันสิ่งเดียวที่แยกความแตกต่างได้คือการนำไปใช้ เมื่อมีการร้องขอ (req) express จะทำการใส่ req เป็นอันดับแรกใน app.get หากการตรวจสอบใด ๆ ที่คุณสร้างขึ้นเนื่องจากคำขอนั้นไม่ได้สำหรับตัวควบคุมนั้นจะล้มเหลวก็จะส่งผ่าน req ไปยัง app.put ซึ่งเป็นเส้นทางถัดไปในไฟล์ te บน. ดังที่เห็นในตัวอย่างด้านล่าง
app.get('/user/:id', function (req,res,next){
if(req.method === 'GET')
//whatever you are going to do
else
return next() //it passes the request to app.put
//Where would GET response 404 go, here? or in the next one.
// Will the GET answer be handled by a PUT? Something is wrong here.
})
app.put('/user/:id', function (req,res,next){
if(req.method === 'PUT')
//whatever you are going to do
else
return next()
})
ปัญหาอยู่ที่ว่าในท้ายที่สุดคุณจะผ่านการร้องขอไปยังตัวควบคุมทั้งหมดโดยหวังว่าจะมีสิ่งที่คุณต้องการผ่านการตรวจสอบความถูกต้องของ req ในที่สุดผู้ควบคุมทั้งหมดก็จะได้รับสิ่งที่ไม่ใช่สำหรับพวกเขา :(
ดังนั้นวิธีการหลีกเลี่ยงปัญหาต่อไป () ?
คำตอบนั้นง่ายจริงๆ.
1- ควรมีเพียงหนึ่ง uriเพื่อระบุทรัพยากร
http: // IpServidor / colection /: resource / colection /: resourceหาก URI ของคุณยาวกว่านั้นคุณควรพิจารณาสร้าง uri ใหม่
ตัวอย่างhttp: // IpServidor / users / pepe / contacts / contacto1
2-All การดำเนินการเกี่ยวกับทรัพยากรนี้จะต้องดำเนินการเคารพ idempotence ของคำกริยา http (รับ, โพสต์, วาง, ลบ, ... ) ดังนั้นการโทรไปยัง URI มีวิธีการโทรเพียงวิธีเดียวเท่านั้น
POST http://IpServidor/users/ //create a pepe user
GET http://IpServidor/users/pepe //user pepe returns
PUT http://IpServidor/users/pepe //update the user pepe
DELETE http://IpServidor/users/pepe //remove the user pepe
ข้อมูลเพิ่มเติม [ https://docs.microsoft.com/es-es/azure/architecture/best-practices/api-design#organize-the-api-around-resources เหมือนพี่น้อง 1]
ลองดูรหัส! การใช้งานอย่างเป็นรูปธรรมที่ทำให้เราหลีกเลี่ยงการใช้งานถัดไป ()!
ในไฟล์ index.js
//index.js the entry point to the application also caller app.js
const express = require('express');
const app = express();
const usersRoute = require('./src/route/usersRoute.js');
app.use('/users', usersRoute );
ในไฟล์ usersRoute.js
//usersRoute.js
const express = require('express');
const router = express.Router();
const getUsersController = require('../Controllers/getUsersController.js');
const deleteUsersController = require('../Controllers/deleteUsersController.js');
router.use('/:name', function (req, res) //The path is in /users/:name
{
switch (req.method)
{
case 'DELETE':
deleteUsersController(req, res);
break;
case 'PUT':
// call to putUsersController(req, res);
break;
case 'GET':
getUsersController(req, res);
break;
default:
res.status(400).send('Bad request');
} });
router.post('/',function (req,res) //The path is in /users/
{
postUsersController(req, res);
});
module.exports = router;
ตอนนี้ไฟล์ usersRoute.js ทำในสิ่งที่ไฟล์ที่เรียกว่า usersRoute ซึ่งคาดว่าจะทำซึ่งก็คือการจัดการเส้นทางของ URI / users /
// ไฟล์ getUsersController.js
//getUsersController.js
const findUser= require('../Aplication/findUser.js');
const usersRepository = require('../Infraestructure/usersRepository.js');
const getUsersController = async function (req, res)
{
try{
const userName = req.params.name;
//...
res.status(200).send(user.propertys())
}catch(findUserError){
res.status(findUserError.code).send(findUserError.message)
}
}
module.exports = getUsersController;
ด้วยวิธีนี้คุณหลีกเลี่ยงการใช้งานในครั้งต่อไปคุณแยกรหัสคุณได้รับประสิทธิภาพคุณพัฒนา SOLID คุณเปิดประตูทิ้งไว้สำหรับการโยกย้ายที่เป็นไปได้เพื่อ microservices และเหนือสิ่งอื่นใดมันง่ายต่อการอ่านโดยโปรแกรมเมอร์
res.redirect('/')
กับเมื่อเทียบกับreturn res.redirect('/')
ในสถานการณ์ประเภทนี้? อาจจะเป็นการดีกว่าถ้าคุณเขียนการส่งคืนคำสั่ง res ด้านหน้าเสมอเพื่อหลีกเลี่ยงข้อผิดพลาดของการตั้งค่าส่วนหัวหลังจากส่งไป