Hiç kullanmamak en iyisidir! Açıklıyorum ve bunu da açıklıyorum.
Herhangi bir ada sahip olabilen next () işlevi, bir sonraki olarak ayarlanmıştır. Örneğin, genellikle aynı URI kaynağı üzerinde gerçekleştirilen işlemlerle (PUT, GET, DELETE, ...) dolaylı olarak ilgilidir./ 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 ()...)
Şimdi app.get, app.put ve app.delete öğelerine bakarsanız aynı uri'yi (/ user /: id) kullanırsanız, onları ayıran tek şey bunların uygulanmasıdır. İstek yapıldığında (req) express, req'i app.get içinde ilk sıraya koyar, bu istek söz konusu denetleyici için olmadığı için oluşturduğunuz herhangi bir doğrulama başarısız olursa, req'i te dosyasında bir sonraki yol olan app.put'a iletir ve böylece üzerinde. Aşağıdaki örnekte görüldüğü gibi.
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()
})
Sorun şu ki, sonunda isteğin doğrulanması yoluyla istediğiniz şeyi yapan bir tane olmasını ümit ederek tüm denetleyicilere isteği iletiyorsunuz. Sonunda, tüm kontrolörler kendileri için olmayan bir şeyi alırlar :(.
Peki next () sorunundan nasıl kaçınılır ?
Cevap gerçekten çok basit.
1- Bir kaynağı tanımlamak için yalnızca bir uri olmalıdır
http: // IpServidor / colection /: resource / colection /: resource eğer URI'niz bundan daha uzunsa, yeni bir uri oluşturmayı düşünmelisiniz
Örnek http: // IpServidor / users / pepe / contact / contacto1
2-Bu kaynak üzerindeki tüm işlemler http (get, post, put, delete, ...) fiillerinin idempotansına göre yapılmalıdır, bu nedenle bir URI'ye yapılan çağrının gerçekten sadece bir arama yolu vardır
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
Daha fazla bilgi [ https://docs.microsoft.com/es-es/azure/architecture/best-practices/api-design#organize-the-api-around-resources][1]
Kodu görelim! Next () kullanımından kaçınmamızı sağlayan somut uygulama!
İndex.js dosyasında
//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 dosyasında
//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;
Artık usersRoute.js dosyası, usersRoute adlı bir dosyanın yapması beklenen şeyi yapar, bu da URI / users /
// getUsersController.js dosyası
//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;
Bu şekilde bir sonraki kullanımdan kaçınırsınız, kodu ayırırsınız, performans kazanırsınız, SOLID geliştirirsiniz, mikro hizmetlere olası bir geçiş için kapıyı açık bırakırsınız ve her şeyden önce bir programcı tarafından okunması kolaydır.
res.redirect('/')
karşı benzer bir şey doğrureturn res.redirect('/')
olur mu? Belki de, gönderildikten sonra başlık ayarlama hatalarını önlemek için her zaman res ifadelerinin önüne return yazmak daha iyidir?