내 node.js 앱은 express / examples / mvc 앱 과 같이 모델링 됩니다.
컨트롤러 작업에서 사용자 지정 http 메시지로 HTTP 400 상태를 내보내고 싶습니다. 기본적으로 http 상태 메시지는 “잘못된 요청”입니다.
HTTP/1.1 400 Bad Request
하지만 나는 보내고 싶어
HTTP/1.1 400 Current password does not match
나는 다양한 방법을 시도했지만 그들 중 어느 것도 내 사용자 정의 메시지에 http 상태 메시지를 설정하지 않았습니다.
내 현재 솔루션 컨트롤러 기능은 다음과 같습니다.
exports.check = function( req, res) {
if( req.param( 'val')!=='testme') {
res.writeHead( 400, 'Current password does not match', {'content-type' : 'text/plain'});
res.end( 'Current value does not match');
return;
}
// ...
}
모든 것이 잘 작동하지만 … 올바른 방법이 아닌 것 같습니다.
Express를 사용하여 http 상태 메시지를 설정하는 더 좋은 방법이 있습니까?
답변
자세한 내용은 이 res.send(400, 'Current password does not match')
Look express 3.x 문서 를 확인할 수 있습니다.
Expressjs 4.x 업데이트
이 방법을 사용하십시오 ( 익스프레스 4.x 문서보기 ).
res.status(400).send('Current password does not match');
// or
res.status(400);
res.send('Current password does not match');
답변
기존 답변 중 어느 것도 OP가 원래 요청한 것을 수행하지 않습니다. 이는 Express에서 보낸 기본 Reason-Phrase (상태 코드 바로 뒤에 나타나는 텍스트 )를 재정의하는 것 입니다.
당신이 원하는 것은 res.statusMessage
. 이것은 Express의 일부가 아니며 Node.js 0.11+의 기본 http.Response 객체의 속성입니다.
다음과 같이 사용할 수 있습니다 (Express 4.x에서 테스트 됨).
function(req, res) {
res.statusMessage = "Current password does not match";
res.status(400).end();
}
그런 다음을 사용 curl
하여 작동하는지 확인합니다.
$ curl -i -s http://localhost:3100/
HTTP/1.1 400 Current password does not match
X-Powered-By: Express
Date: Fri, 08 Apr 2016 19:04:35 GMT
Connection: keep-alive
Content-Length: 0
답변
서버 측 (Express 미들웨어) :
if(err) return res.status(500).end('User already exists.');
클라이언트 측에서 처리
모난:-
$http().....
.error(function(data, status) {
console.error('Repos error', status, data);//"Repos error" 500 "User already exists."
});
jQuery :-
$.ajax({
type: "post",
url: url,
success: function (data, text) {
},
error: function (request, status, error) {
alert(request.responseText);
}
});
답변
Express에서 이와 같은 사용자 지정 오류를 처리하는 우아한 방법은 다음과 같습니다.
function errorHandler(err, req, res, next) {
var code = err.code;
var message = err.message;
res.writeHead(code, message, {'content-type' : 'text/plain'});
res.end(message);
}
(이를 위해 express의 내장 express.errorHandler 를 사용할 수도 있습니다 )
그런 다음 미들웨어에서 경로 전에 :
app.use(errorHandler);
그런 다음 ‘현재 비밀번호가 일치하지 않습니다’라는 오류를 생성하려는 위치 :
function checkPassword(req, res, next) {
// check password, fails:
var err = new Error('Current password does not match');
err.code = 400;
// forward control on to the next registered error handler:
return next(err);
}
답변
이렇게 사용할 수 있습니다
return res.status(400).json({'error':'User already exists.'});
답변
내 사용 사례는 내 REST API를 구동하기 위해 express를 사용하고 있기 때문에 사용자 지정 JSON 오류 메시지를 보내고 있습니다. 나는 이것이 상당히 일반적인 시나리오라고 생각하므로 내 대답에서 그것에 중점을 둘 것입니다.
짧은 버전 :
특히 서명 (err, req, res, next)을 사용하여 3 개 대신 4 개의 인수를 사용하는 것을 제외하고는 다른 미들웨어와 마찬가지로 오류 처리 미들웨어를 정의하십시오. … 다른 app.use () 및 라우팅 호출 이후 마지막으로 오류 처리 미들웨어를 정의합니다.
app.use(function(err, req, res, next) {
if (err instanceof JSONError) {
res.status(err.status).json({
status: err.status,
message: err.message
});
} else {
next(err);
}
});
다음을 수행하여 코드의 모든 지점에서 오류를 발생시킵니다.
var JSONError = require('./JSONError');
var err = new JSONError(404, 'Uh oh! Can't find something');
next(err);
긴 버전
오류를 던지는 표준 방법은 다음과 같습니다.
var err = new Error("Uh oh! Can't find something");
err.status = 404;
next(err)
기본적으로 Express는 코드 404와 스택 추적이 추가 된 메시지 문자열로 구성된 본문이 포함 된 HTTP 응답으로 깔끔하게 패키징하여이를 처리합니다.
예를 들어 Express를 REST 서버로 사용할 때는 작동하지 않습니다. 오류가 HTML이 아닌 JSON으로 다시 전송되기를 원합니다. 또한 내 스택 추적이 내 클라이언트로 이동하는 것을 원하지 않습니다.
req.json()
예를 들어 JSON을 사용하여 응답으로 보낼 수 있습니다 . 같은 것 req.json({ status: 404, message: 'Uh oh! Can't find something'})
. 선택적으로을 사용하여 상태 코드를 설정할 수 있습니다 req.status()
. 두 가지 결합 :
req.status(404).json({ status: 404, message: 'Uh oh! Can't find something'});
이것은 매력처럼 작동합니다. 즉, 오류가 발생할 때마다 입력하는 것이 매우 다루기 어렵고 코드는 더 이상 우리처럼 자체 문서화되지 않습니다 next(err)
. 정상적인 (즉, 유효한) 응답 JSON이 전송되는 방식과 너무 비슷해 보입니다. 또한 표준 접근 방식에서 발생하는 오류는 여전히 HTML 출력으로 이어집니다.
이것이 Express의 오류 처리 미들웨어가 들어오는 곳입니다. 내 경로의 일부로 다음을 정의합니다.
app.use(function(err, req, res, next) {
console.log('Someone tried to throw an error response');
});
또한 Error를 사용자 지정 JSONError 클래스로 하위 분류합니다.
JSONError = function (status, message) {
Error.prototype.constructor.call(this, status + ': ' + message);
this.status = status;
this.message = message;
};
JSONError.prototype = Object.create(Error);
JSONError.prototype.constructor = JSONError;
이제 코드에서 오류를 던지고 싶을 때 다음을 수행합니다.
var err = new JSONError(404, 'Uh oh! Can't find something');
next(err);
사용자 지정 오류 처리 미들웨어로 돌아가서 다음과 같이 수정합니다.
app.use(function(err, req, res, next) {
if (err instanceof JSONError) {
res.status(err.status).json({
status: err.status,
message: err.message
});
} else {
next(err);
}
}
오류를 JSONError로 서브 클래 싱하는 것은 중요합니다. Express가 instanceof Error
a next()
에 전달 된 첫 번째 매개 변수 를 확인하여 일반 핸들러 또는 오류 핸들러를 호출 해야하는지 여부를 결정하기 때문입니다. instanceof JSONError
확인을 제거하고 예기치 않은 오류 (예 : 충돌)도 JSON 응답을 반환하도록 약간의 수정을 수행 할 수 있습니다.
답변
Axios를 사용할 때 다음을 사용하여 사용자 지정 응답 메시지를 검색 할 수 있습니다.
Axios.get(“your_url”)
.then(data => {
... do something
}.catch( err => {
console.log(err.response.data) // you want this
})
… Express에서 다음과 같이 설정 한 후 :
res.status(400).send(“your custom message”)