전혀 사용하지 않는 것이 가장 좋습니다! 나는 설명하고 그것이 또한 설명하는 것입니다.
이름과 규칙을 사용할 수있는 next () 함수는 next로 설정되었습니다. 예를 들어 동일한 URI 리소스에서 일반적으로 수행되는 작업 (PUT, GET, DELETE, ...)과 간접적으로 관련됩니다./ 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가 te 파일의 다음 경로 인 app.put으로 요청을 전달합니다. 의 위에. 아래 예에서 볼 수 있듯이.
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의 유효성 검사를 통해 원하는 것을하는 컨트롤러가 있기를 희망하면서 모든 컨트롤러에 req를 전달한다는 것입니다. 결국 모든 컨트롤러는 자신에게 적합하지 않은 것을받습니다.
그렇다면 다음 ()의 문제를 피하는 방법은 무엇입니까?
대답은 정말 간단합니다.
1- 자원을 식별하기위한 URI가 하나만 있어야 합니다.
URI가 이보다 길면 http : // IpServidor / colection / : resource / colection / : resource 새로운 URI 생성을 고려해야합니다.
예 http : // IpServidor / users / pepe / contacts / contacto1
2-이 자원에 대한 모든 조작은 http (get, post, put, delete 등) 동사의 dem 등원과 관련하여 수행되어야하므로 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]
코드를 보자! next ()를 사용하지 않도록하는 구체적인 구현!
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를 개발하며 마이크로 서비스로 마이그레이션 할 수있는 문을 열어두고 프로그래머가 쉽게 읽을 수 있습니다.
res.redirect('/')
대return res.redirect('/')
이러한 유형의 상황에서? 헤더를 보낸 후 설정 오류가 발생하지 않도록 항상 res 문 앞에 return을 작성하는 것이 더 낫습니다.