다음 기능을 표현합니다. 정말 무엇을 위한 것입니까?
무엇에 대한 좋은 설명을 찾으려고 노력해 왔습니다.next()
방법은 그렇습니다.익스프레스 문서에는 다음과 같이 나와 있습니다.next('route')
해당 경로로 점프하여 중간에 있는 모든 경로를 건너뛰는 데 사용할 수 있지만, 때때로next
인수 없이 호출됩니다.누구나 그것을 설명하는 좋은 튜토리얼 등에 대해 알고 있습니다.next
기능?
next()
"농담일 뿐, 나는 실제로 이것을 처리하고 싶지 않다"는 주장이 없습니다.다시 들어가서 일치하는 다음 경로를 찾으려고 합니다.
이것은 URL 슬러그뿐만 아니라 다른 많은 것들을 가진 페이지 관리자를 갖고 싶다면 유용하지만, 여기 예가 있습니다.
app.get('/:pageslug', function(req, res, next){
var page = db.findPage(req.params.pageslug);
if (page) {
res.send(page.body);
} else {
next();
}
});
app.get('/other_routes', function() {
//...
});
구성된 코드는 데이터베이스에서 특정 ID 슬러그를 가진 페이지를 확인해야 합니다.하나를 찾으면 렌더링!을 찾을 수 없으면 이 경로 핸들러를 무시하고 다른 경로 핸들러를 확인합니다.
그렇게next()
인수가 없으면 경로를 처리하지 않은 것처럼 가장하여 다른 무언가가 대신 경로를 픽업할 수 있습니다.
아면히카가터운트니▁with▁counter▁hit가 있는 히트 카운터.app.all('*')
이를 통해 공유 설정 코드를 실행한 다음 다른 경로로 이동하여 보다 구체적인 작업을 수행할 수 있습니다.
app.all('*', function(req, res, next){
myHitCounter.count += 1;
next();
});
app.get('/other_routes', function() {
//...
});
대부분의 프레임워크에서 요청을 받고 응답을 반환하려고 합니다.Node.js의 비동기성 때문에 사소한 것이 아닌 작업을 수행하는 경우 중첩된 콜백 문제가 발생합니다.Connect.js(v4.0 이전의 Express.js는 connect.js 위의 레이어)라는 매개 변수가 2, 3 또는 4개인 함수를 가지고 있습니다.
function (<err>, req, res, next) {}
Express.js 앱은 이러한 기능의 스택입니다.
라우터는 특수하며 특정 URL에 대해 하나 이상의 미들웨어를 실행할 수 있는 미들웨어입니다.즉, 스택 내부의 스택입니다.
다음은 무엇을 할까요?간단히 말하면, 앱이 다음 미들웨어를 실행하도록 지시합니다.하지만 당신이 무언가를 다음으로 넘기면 어떻게 될까요?Express는 현재 스택을 중단하고 매개 변수가 4개인 모든 미들웨어를 실행합니다.
function (err, req, res, next) {}
이 미들웨어는 오류를 처리하는 데 사용됩니다.저는 다음을 좋아합니다.
next({ type: 'database', error: 'datacenter blew up' });
이 오류가 발생하면 사용자에게 뭔가 잘못되었다고 말하고 실제 오류를 기록할 것입니다.
function (err, req, res, next) {
if (err.type === 'database') {
res.send('Something went wrong user');
console.log(err.error);
}
};
Express.js 응용 프로그램을 스택으로 상상하면 많은 이상한 점을 스스로 고칠 수 있을 것입니다.예를 들어 라우터를 사용한 후 쿠키 미들웨어를 추가하면 경로에 쿠키가 없습니다.
문서
오류 처리 미들웨어는 특히 서명(err, req, res, next)을 사용하여 세 개 대신 네 개의 인수를 사용하는 것을 제외하고 다른 미들웨어와 동일한 방법으로 정의합니다.
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
IMHO, 이 질문에 대한 수용된 대답은 정말 정확하지 않습니다.다른 사람들이 말했듯이, 이것은 실제로 체인의 다음 핸들러가 실행되는 시기를 제어하는 것입니다.하지만 좀 더 구체적인 코드를 제공하고 싶었습니다.다음과 같은 간단한 고속 앱을 가지고 있다고 가정해 보십시오.
var express = require('express');
var app = express();
app.get('/user/:id', function (req, res, next) {
console.log('before request handler');
next();
});
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
next();
});
app.get('/user/:id', function (req, res, next) {
console.log('after request handler');
next();
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
});
네가 한다면.
curl http://localhost:3000/user/123
콘솔에 다음과 같이 인쇄됩니다.
before request handler
handling request
after request handler
이제 당신이 의견을 제시한다면,next()
다음과 같은 중간 처리기에서:
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
//next();
});
콘솔에 다음과 같은 내용이 표시됩니다.
before request handler
handling request
핸들러("마인핸러는들핸들러막지()들러(▁prints)"를 하는 핸들러하십시오.after request handler
가 실행되지 않습니다.이는 더 이상 익스프레스에 다음 처리기를 실행하도록 지시하지 않기 때문입니다.
따라서 "메인" 핸들러(200을 반환하는 핸들러)가 성공했는지 여부는 중요하지 않습니다. 나머지 미들웨어를 실행하려면 전화를 걸어야 합니다.next()
.
언제쯤이면 도움이 될까요?요청의 성공 여부와 관계없이 일부 데이터베이스에 들어온 모든 요청을 기록하려고 합니다.
app.get('/user/:id', function (req, res, next) {
try {
// ...
}
catch (ex) {
// ...
}
finally {
// go to the next handler regardless of what happened in this one
next();
}
});
app.get('/user/:id', function (req, res, next) {
logToDatabase(req);
next();
});
두 번째 핸들러를 실행하려면 다음을 호출해야 합니다.next()
첫 번째 핸들러에서.
노드는 비동기이므로 첫 번째 핸들러의 콜백이 언제 완료되었는지 알 수 없습니다.전화로 말해야 합니다.next()
.
매개 변수가 없는 next()는 다음 경로 처리기 또는 프레임워크의 다음 미들웨어를 호출합니다.
올바르게 언급된 답변을 한 곳에 요약하면,
- next() : 컨트롤을 같은 경로의 다음 함수로 이동합니다.단일 경로에서 다중 함수의 경우.
- next("route') : 현재 경로에 남아 있는 모든 함수를 건너뛰어 제어를 다음 경로로 이동합니다.
- next(err) : 오류 미들웨어로 컨트롤 이동
app.get('/testroute/:id', function (req, res, next) {
if (req.params.id === '0') next() // Take me to the next function in current route
else if (req.params.id === '1') next('route') //Take me to next routes/middleware by skipping all other functions in current router
else next(new Error('Take me directly to error handler middleware by skipping all other routers/middlewares'))
}, function (req, res, next) {
// render a regular page
console.log('Next function in current route')
res.status(200).send('Next function in current route');
})
// handler for the /testroute/:id path, which renders a special page
app.get('/testroute/:id', function (req, res, next) {
console.log('Next routes/middleware by skipping all other functions in current router')
res.status(200).send('Next routes/middleware by skipping all other functions in current router');
})
//error middleware
app.use(function (err, req, res, next) {
console.log('take me to next routes/middleware by skipping all other functions in current router')
res.status(err.status || 500).send(err.message);
});
다음('루트')의 사용에 대해서도 질문이 제기되었으며, 지금까지 제공된 답변에서 주별로 다루어진 것으로 보입니다.
- 다음()의 용도:
간단히 말해서, 다음 미들웨어 기능입니다.
이 공식 Express JS 문서 - '쓰기 미들웨어' 페이지에서 발췌:
미들웨어 함수 myLogger는 메시지를 출력하기만 하면 다음() 함수를 호출하여 스택에 있는 다음 미들웨어 함수로 요청을 전달합니다.
var express = require('express')
var app = express()
var myLogger = function (req, res, next) {
console.log('LOGGED')
next()
}
app.use(myLogger)
app.get('/', function (req, res) {
res.send('Hello World!')
})
app.listen(3000)
Express JS 문서의 이 페이지에는 "현재 미들웨어 기능이 요청-응답 사이클을 종료하지 않으면 다음 미들웨어 기능으로 제어권을 전달하기 위해 next()를 호출해야 합니다.그렇지 않으면, 그 요청은 교수형에 처해질 것입니다."
- 다음 사용법('route'):
요약: 다음 경로(다음()의 경우 다음 미들웨어 기능 대 다음())
Express JS 문서 'using-middleware' 페이지에서 발췌:
"라우터 미들웨어 스택에서 나머지 미들웨어 함수를 건너뛰려면 next('route')를 호출하여 다음 경로로 제어 권한을 전달합니다.참고: next('route')는 앱을 사용하여 로드된 미들웨어 기능에서만 작동합니다.방법() 또는 라우터.MODE() 함수입니다.
이 예제에서는 /user/:id 경로에 대한 GET 요청을 처리하는 미들웨어 하위 스택을 보여 줍니다."
app.get('/user/:id', function (req, res, next) {
// if the user ID is 0, skip to the next route
if (req.params.id === '0') next('route')
// otherwise pass the control to the next middleware function in this stack
else next()
}, function (req, res, next) {
// render a regular page
res.render('regular')
})
// handler for the /user/:id path, which renders a special page
app.get('/user/:id', function (req, res, next) {
res.render('special')
})
이는 단순히 다음 핸들러에게 제어권을 전달하는 것을 의미합니다.
건배.
위의 다음() 통화 내용을 확인합니다.이 기능을 호출하면 앱의 다음 미들웨어 기능이 호출됩니다.next() 함수는 Node.js 또는 Express API의 일부가 아니라 미들웨어 함수에 전달되는 세 번째 인수입니다.다음() 함수는 임의의 이름으로 지정할 수 있지만 관례에 따라 항상 "다음"으로 지정됩니다.혼동을 방지하려면 항상 이 규칙을 사용하십시오.
next()는 req를 사용하는 미들웨어 함수에 대한 콜백 인수이며, 아래 코드에서 next(다음)에 대한 http 요청 및 응답 인수입니다.
app.get{}/, (req, res, next) => {next};
그래서 다음()은 전달된 미들웨어 함수를 호출합니다.현재 미들웨어 기능이 요청-응답 사이클을 종료하지 않으면 next()를 호출해야 합니다. 그렇지 않으면 요청이 보류된 상태로 유지되고 시간이 초과됩니다.
여러 미들웨어 함수가 app.use 또는 app로 전달될 때 각 미들웨어 함수 내에서 next() fn을 호출해야 합니다.MODE, 그렇지 않으면 다음 미들웨어 함수가 호출되지 않습니다(하나 이상의 미들웨어 함수가 전달된 경우).나머지 미들웨어 함수 호출을 건너뛰려면 미들웨어 함수 내에서 next('route')를 호출하고 이후에 다른 미들웨어 함수를 호출하면 안 됩니다.아래 코드에서는 next()가 fn1 내에서 호출되므로 fn1이 호출되고 fn2도 호출됩니다.그러나 next('route')는 fn2 내에서 호출되므로 fn3은 호출되지 않습니다.
app.get('/fetch', function fn1(req, res, next) {
console.log("First middleware function called");
next();
},
function fn2(req, res, next) {
console.log("Second middleware function called");
next("route");
},
function fn3(req, res, next) {
console.log("Third middleware function will not be called");
next();
})
언급URL : https://stackoverflow.com/questions/13133071/express-next-function-what-is-it-really-for
'programing' 카테고리의 다른 글
Base64를 사용하여 Base64에서 문자열을 디코딩하고 인코딩하는 방법을 아는 사람이 있습니까? (0) | 2023.08.06 |
---|---|
데이터베이스에 메타데이터를 유지하지 않고 Spring-Batch? (0) | 2023.08.06 |
배경 이미지를 div에 맞춤 (0) | 2023.08.06 |
jQuery UI 탭 - 현재 선택한 탭 인덱스를 가져오는 방법 (0) | 2023.08.06 |
Python은 적절한 시간대에 현재 시간을 얻습니다. (0) | 2023.08.06 |