Yang terbaik adalah tidak menggunakannya sama sekali! Saya menjelaskan, dan itulah yang saya lakukan juga menjelaskannya.
Fungsi next () yang dapat memiliki nama apa pun dan dengan konvensi telah diatur ke berikutnya. Ini secara tidak langsung terkait dengan operasi (PUT, DAPATKAN, HAPUS, ...) yang umumnya dilakukan pada sumber daya URI yang sama misalnya/ 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 ()...)
Sekarang jika Anda melihat app.get, app.put dan app.delete menggunakan uri yang sama (/ user /: id), satu-satunya hal yang membedakan mereka adalah implementasinya. Ketika permintaan dibuat (req) express menempatkan req terlebih dahulu di app.get, jika validasi apa pun yang Anda buat karena permintaan itu bukan untuk pengontrol itu gagal, ia meneruskan req ke app.put yang merupakan rute selanjutnya dalam file te dan sebagainya di. Seperti yang terlihat pada contoh di bawah ini.
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()
})
Masalahnya terletak, bahwa pada akhirnya Anda akhirnya menyerahkan req ke semua pengendali berharap ada satu yang melakukan apa yang Anda inginkan, melalui validasi req. Pada akhirnya semua pengendali akhirnya menerima sesuatu yang bukan untuk mereka :(.
Jadi, bagaimana cara menghindari masalah next () ?
Jawabannya sangat sederhana.
1 - hanya harus ada satu uri untuk mengidentifikasi sumber daya
http: // IpServidor / colection /: resource / colection /: resource jika URI Anda lebih lama dari itu, Anda harus mempertimbangkan membuat uri baru
Contoh http: // IpServidor / pengguna / pepe / kontak / contacto1
2-Semua operasi pada sumber ini harus dilakukan dengan menghormati idempotence dari kata kerja http (get, post, put, delete, ...) sehingga panggilan ke URI benar-benar hanya memiliki satu cara panggilan
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
Info lebih lanjut [ https://docs.microsoft.com/es-es/azure/architecture/best-practices/api-design#organize-the-api-around-resources[[1]
Mari kita lihat kodenya! Implementasi konkret yang membuat kita menghindari penggunaan next ()!
Dalam file 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 );
Dalam file 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;
Sekarang file usersRoute.js melakukan apa yang diharapkan dilakukan oleh file yang disebut usersRoute, yaitu mengelola rute URI / pengguna /
// file 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;
Dengan cara ini Anda menghindari penggunaan selanjutnya, Anda decouple kode, Anda mendapatkan kinerja, Anda mengembangkan SOLID, Anda membiarkan pintu terbuka untuk kemungkinan migrasi ke layanan Microsoft dan di atas semua itu, mudah dibaca oleh seorang programmer.
res.redirect('/')
vsreturn res.redirect('/')
dalam situasi seperti ini? Mungkin lebih baik untuk selalu menulis balasan di depan pernyataan res untuk menghindari kesalahan pengaturan header setelah dikirim?