오류 : 클라이언트로 보낸 후 헤더를 설정할 수 없습니다.
저는 Node.js를 처음 접했고 몇 가지 문제가 있습니다.
Node.js 4.10 및 Express 2.4.3을 사용하고 있습니다.
내가 액세스하려고하면 http://127.0.0.1:8888/auth/facebook , 내가로 연결됩니다 http://127.0.0.1:8888/auth/facebook_callback .
그런 다음 다음 오류를 받았습니다.
Error: Can't render headers after they are sent to the client.
at ServerResponse.<anonymous> (http.js:573:11)
at ServerResponse._renderHeaders (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:64:25)
at ServerResponse.writeHead (http.js:813:20)
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/auth.strategies/facebook.js:28:15
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:113:13
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/strategyExecutor.js:45:39)
at [object Object].pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:32:3)
at [object Object].halt (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:29:8)
at [object Object].redirect (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:16:8)
at [object Object].<anonymous> (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/auth.strategies/facebook.js:77:15)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:195:11)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at param (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:189:13)
at pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:191:10)
at Object.router [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:197:6)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at param (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:189:13)
at pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:191:10)
at Object.router [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:197:6)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at HTTPServer.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:211:3)
at Object.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:105:14)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at HTTPServer.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:211:3)
at Object.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:105:14)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:323:9
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:338:9
node.js:134
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:323:9
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:338:9
at Array.<anonymous> (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session/memory.js:57:7)
at EventEmitter._tickCallback (node.js:126:26)
다음은 내 코드입니다.
var fbId= "XXX";
var fbSecret= "XXXXXX";
var fbCallbackAddress= "http://127.0.0.1:8888/auth/facebook_callback"
var cookieSecret = "node"; // enter a random hash for security
var express= require('express');
var auth = require('connect-auth')
var app = express.createServer();
app.configure(function(){
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({secret: cookieSecret}));
app.use(auth([
auth.Facebook({
appId : fbId,
appSecret: fbSecret,
callback: fbCallbackAddress,
scope: 'offline_access,email,user_about_me,user_activities,manage_pages,publish_stream',
failedUri: '/noauth'
})
]));
app.use(app.router);
});
app.get('/auth/facebook', function(req, res) {
req.authenticate("facebook", function(error, authenticated) {
if (authenticated) {
res.redirect("/great");
console.log("ok cool.");
console.log(res['req']['session']);
}
});
});
app.get('/noauth', function(req, res) {
console.log('Authentication Failed');
res.send('Authentication Failed');
});
app.get('/great', function( req, res) {
res.send('Supercoolstuff');
});
app.listen(8888);
내 코드에 어떤 문제가 있는지 알 수 있습니까?
res
Express 의 객체는 Node.js의http.ServerResponse
하위 클래스입니다 ( http.js 소스 읽기 ). 전화 res.setHeader(name, value)
할 때까지 원하는만큼 자주 전화 할 수 있습니다 res.writeHead(statusCode)
. 그 후에 writeHead
헤더가 구워지고 res.write(data)
, 마지막으로 만 호출 할 수 있습니다 res.end(data)
.
"오류 : 헤더를 보낸 후 설정할 수 없습니다."오류가 발생합니다. 이미 Body 또는 Finished 상태에 있지만 일부 함수가 헤더 또는 statusCode를 설정하려고 시도했음을 의미합니다. 이 오류가 표시되면 본문의 일부가 이미 작성된 후 헤더를 보내려고 시도하는 항목을 찾으십시오. 예를 들어 실수로 두 번 호출 된 콜백이나 본문이 전송 된 후 발생하는 오류를 찾습니다.
귀하의 경우에는을 (를) 호출 res.redirect()
하여 응답이 완료되었습니다. 그런 다음 코드에서 오류가 발생했습니다 ( res.req
is null
). 오류가 실제 function(req, res, next)
(콜백 내에서가 아님) 내 에서 발생했기 때문에 Connect는 오류를 포착 한 다음 500 오류 페이지를 보내려고했습니다. 그러나 헤더가 이미 전송되었으므로 Node.js에서 setHeader
본 오류가 발생했습니다.
Node.js / Express 응답 메서드의 포괄적 인 목록과 호출시기 :
응답에 있어야 헤드 및 유지 헤드 :
res.writeContinue()
res.statusCode = 404
res.setHeader(name, value)
res.getHeader(name)
res.removeHeader(name)
res.header(key[, val])
(익스프레스 만 해당)res.charset = 'utf-8'
(Express 전용, Express 전용 메서드에만 영향을 미침)res.contentType(type)
(익스프레스 만 해당)
응답은 Head에 있어야하며 Body 가됩니다 .
응답 중 하나 일 수 있습니다 헤드 / 바디 와 남아 바디 :
응답 중 하나 일 수 있습니다 헤드 / 바디 및됩니다 완료 :
응답은 Head / Body 중 하나 일 수 있으며 현재 상태를 유지합니다.
응답에 있어야 헤드 및됩니다 완료 :
return next([err])
(Connect / Express 만 해당)- 미들웨어 내의 모든 예외
function(req, res, next)
(Connect / Express에만 해당) res.send(body|status[, headers|status[, status]])
(익스프레스 만 해당)res.attachment(filename)
(익스프레스 만 해당)res.sendfile(path[, options[, callback]])
(익스프레스 만 해당)res.json(obj[, headers|status[, status]])
(익스프레스 만 해당)res.redirect(url[, status])
(익스프레스 만 해당)res.cookie(name, val[, options])
(익스프레스 만 해당)res.clearCookie(name[, options])
(익스프레스 만 해당)res.render(view[, options[, fn]])
(익스프레스 만 해당)res.partial(view[, options])
(익스프레스 만 해당)
나는 잠시 동안이 오류가 발생했습니다. 나는 (희망) 머리를 감싸고 여기에 참고 용으로 쓰고 싶었습니다.
방법을 사용 하여 connect 또는 express (connect에 구축 됨)에 미들웨어를 추가하면 connect에app.use
항목을 추가하게됩니다 Server.prototype.stack
(적어도이 npm install connect
게시물의 github와 상당히 다른 현재 ). 서버가 요청을 받으면 스택을 반복하여 (request, response, next)
메서드를 호출합니다 .
문제는 미들웨어 항목 중 하나에서 응답 본문 또는 헤더에 쓰지만 (response.end()
next()
또는 어떤 이유로 든 해당하는 것처럼 보임) 호출하지 않고 핵심 Server.prototype.handle
메서드가 완료 될 때 호출 하면 알아 차릴 수 있다는 것입니다. 그:
- 스택에 더 이상 항목이 없습니다.
- 그것은
response.headerSent
사실입니다.
따라서 오류가 발생합니다. 그러나 발생하는 오류는 다음과 같은 기본 응답입니다 (연결 http.js
소스 코드에서 :
res.statusCode = 404;
res.setHeader('Content-Type', 'text/plain');
res.end('Cannot ' + req.method + ' ' + req.url);
바로 거기에서 다음과 같이 response.end ()를 호출하지 않고 메서드에 res.setHeader('Content-Type', 'text/plain');
설정했을 가능성이있는 을 호출합니다 .render
response.setHeader("Content-Type", "text/html");
response.write("<p>Hello World</p>");
모든 것이 구조화되어야하는 방식은 다음과 같습니다.
좋은 미들웨어
// middleware that does not modify the response body
var doesNotModifyBody = function(request, response, next) {
request.params = {
a: "b"
};
// calls next because it hasn't modified the header
next();
};
// middleware that modify the response body
var doesModifyBody = function(request, response, next) {
response.setHeader("Content-Type", "text/html");
response.write("<p>Hello World</p>");
response.end();
// doesn't call next()
};
app.use(doesNotModifyBody);
app.use(doesModifyBody);
문제가있는 미들웨어
var problemMiddleware = function(request, response, next) {
response.setHeader("Content-Type", "text/html");
response.write("<p>Hello World</p>");
next();
};
문제가있는 미들웨어 는를 response.end()
호출 하지 않고 응답 헤더를 설정하여 next()
연결의 서버를 혼란스럽게합니다.
나는 이와 같은 문제가 있었고 그것이 진술 res.redirect
없이 호출했기 return
때문에 그 next
함수가 즉시 호출된다는 것을 깨달았습니다 .
auth.annonymousOnly = function(req, res, next) {
if (req.user) res.redirect('/');
next();
};
어느 것이되어야 했습니까?
auth.annonymousOnly = function(req, res, next) {
if (req.user) return res.redirect('/');
next();
};
많은 사람들이이 오류에 부딪 혔습니다. 이것을 비동기 처리와 혼동합니다. 대부분의 코드는 첫 번째 틱에서 헤더를 설정 한 다음 향후 틱에서 비동기 콜백을 실행하는 것입니다. 그 사이에 응답 헤더가 전송되지만 추가 헤더 (예 : 30X 리디렉션)가 추가 헤더를 추가하려고 시도하지만 응답 헤더가 이미 전송 되었기 때문에 너무 늦습니다.
오류의 원인이 정확히 무엇인지 확실하지 않지만 조사해야 할 잠재적 영역으로 콜백을 살펴보십시오.
코드를 단순화하기위한 간단한 팁입니다. 제거 app.configure()
하고 app.use
최상위 범위에서 직접 전화 하십시오.
Facebook 및 기타 타사 인증 공급자를 수행 하는 everyauth 모듈 도 참조하십시오 .
이 Q & A의 일부 답변이 잘못되었습니다. 받아 들여지는 답변도 "실용적"이 아니므로 더 간단한 용어로 설명하는 답변을 게시하고 싶습니다. 내 대답은 내가 계속해서 게시되는 오류의 99 %를 다룰 것입니다. 오류의 실제 이유는 허용되는 답변을 살펴보십시오.
HTTP는 요청 당 하나의 응답이 필요한주기를 사용합니다. 클라이언트가 요청 (예 : POST 또는 GET)을 보낼 때 서버는 하나의 응답 만 다시 보내야합니다.
이 오류 메시지 :
오류 : 헤더를 보낸 후에는 설정할 수 없습니다.
일반적으로 하나의 요청에 대해 여러 응답을 보낼 때 발생합니다. 다음 함수가 요청 당 한 번만 호출되는지 확인하십시오.
res.json()
res.send()
res.redirect()
res.render()
(그리고 거의 사용되지 않는 몇 가지 더, 수락 된 답변을 확인하세요)
이러한 res 함수가 호출되면 경로 콜백이 반환되지 않습니다. 함수 또는 return 문이 끝날 때까지 계속 실행됩니다. 응답을 보낼 때 반환하려면 다음과 같이 할 수 있습니다 return res.send()
..
예를 들어 다음 코드를 살펴보십시오.
app.post('/api/route1', function(req, res) {
console.log('this ran');
res.status(200).json({ message: 'ok' });
console.log('this ran too');
res.status(200).json({ message: 'ok' });
}
POST 요청이 / api / route1로 전송 되면 콜백의 모든 행이 실행됩니다. 가 전송 된 후 캔은 헤더를 설정하지 때문에 오류 메시지가 발생합니다 res.json()
두 번 호출되는 두 개의 응답이 전송됩니다 의미.
요청 당 하나의 응답 만 보낼 수 있습니다!
위 코드 샘플의 오류는 분명했습니다. 보다 일반적인 문제는 여러 분기가있는 경우입니다.
app.get('/api/company/:companyId', function(req, res) {
const { companyId } = req.params;
Company.findById(companyId).exec((err, company) => {
if (err) {
res.status(500).json(err);
} else if (!company) {
res.status(404).json(); // This runs.
}
res.status(200).json(company); // This runs as well.
});
}
콜백이 첨부 된이 경로는 데이터베이스에서 회사를 찾습니다. 존재하지 않는 회사에 대한 쿼리를 수행 할 때 else if
지점 내부로 들어가 404 응답을 보냅니다. 그 후 응답을 보내는 다음 문으로 계속 진행합니다. 이제 두 개의 응답을 보냈고 오류 메시지가 발생합니다. 하나의 응답 만 보내도록하여이 코드를 수정할 수 있습니다.
.exec((err, company) => {
if (err) {
res.status(500).json(err);
} else if (!company) {
res.status(404).json(); // Only this runs.
} else {
res.status(200).json(company);
}
});
또는 응답이 전송 될 때 반환하여 :
.exec((err, company) => {
if (err) {
return res.status(500).json(err);
} else if (!company) {
return res.status(404).json(); // Only this runs.
}
return res.status(200).json(company);
});
큰 죄인은 비동기 함수입니다. 이 질문 에서 함수를 가져옵니다. 예를 들면 다음과 같습니다.
article.save(function(err, doc1) {
if (err) {
res.send(err);
} else {
User.findOneAndUpdate({ _id: req.user._id }, { $push: { article: doc._id } })
.exec(function(err, doc2) {
if (err) res.send(err);
else res.json(doc2); // Will be called second.
})
res.json(doc1); // Will be called first.
}
});
여기 findOneAndUpdate()
코드 샘플에 비동기 함수 ( )가 있습니다. 오류가없는 경우 ( err
) findOneAndUpdate()
가 호출됩니다. 이 함수는 비동기식이기 때문에 res.json(doc1)
즉시 호출됩니다. 에 오류가 없다고 가정합니다 findOneAndUpdate()
. res.json(doc2)
에서는 else
다음 호출됩니다. 이제 두 개의 응답이 전송되었으며 헤더를 설정할 수 없음 오류 메시지가 발생합니다.
이 경우 수정 사항은 res.json(doc1)
. 두 문서를 모두 클라이언트에 다시 보내려면 res.json()
else in을 res.json({ article: doc1, user: doc2 })
.
이 문제에 대해 고개를 숙이고 콜백 처리에 대한 부주의 한 실수로 인해 발생했습니다. 반환되지 않은 콜백은 응답이 두 번 설정되도록합니다.!
내 프로그램에는 요청을 확인하고 DB를 쿼리하는 코드가 있습니다. 오류가 있는지 확인한 후 유효성 검사 오류와 함께 index.js를 다시 호출했습니다. 그리고 유효성 검사가 통과되면 성공 / 실패로 db에 도달합니다.
var error = validateRequestDetails("create",queryReq);
if (error)
callback(error, null);
else
some code
callback(null, success);
무슨 일이 있었는지 : Incase 유효성 검사가 실패하면 콜백이 호출되고 응답이 설정됩니다. 그러나 반환되지 않았습니다. 따라서 여전히 메서드는 db로 이동하여 success / failure를 누릅니다. 동일한 콜백을 다시 호출하여 응답이 이제 두 번 설정되도록합니다.
따라서 해결책은 간단합니다. 일단 오류가 발생하면 메서드가 계속 실행되지 않도록 콜백을 '반환'해야하며 따라서 응답 객체를 한 번 설정해야합니다.
var error = validateRequestDetails("create",queryReq);
if (error)
callback(error, null);
return;
else
some code
callback(null, success);
응답을 보낸 후 문을 전달할 때 이러한 유형의 오류가 발생합니다.
예를 들면 :
res.send("something response");
console.log("jhgfjhgsdhgfsdf");
console.log("sdgsdfhdgfdhgsdf");
res.send("sopmething response");
일단 응답이 전송되면 다음 res.send
이 실행되지 않기 때문에 표시되는 오류가 발생합니다 .
원하는 것이 있으면 응답을 보내기 전에해야합니다.
res.end 또는 res.send 다음에 next () 함수를 호출하려고 할 때이 오류가 발생할 수 있습니다. 함수에 res.send 또는 res.end 후에 next ()가 있으면 삭제를 시도하십시오. 참고 : 여기서 next ()는 응답 ( 예 : res.send 또는 res.end )으로 클라이언트에 응답 한 후에도 여전히 일부 코드를 실행하여 다시 응답하려고 시도하고 있으므로 합법적이지 않음을 의미합니다.
예 :
router.get('/',function (req,res,next){
res.send("request received");
next(); // this will give you the above exception
});
next()
위의 기능에서 제거 하면 작동합니다.
콜백 함수를 사용 return
하는 경우 err
블록 뒤에 사용 하십시오 . 이 오류가 발생할 수있는 시나리오 중 하나입니다.
userModel.createUser(data, function(err, data) {
if(err) {
res.status = 422
res.json(err)
return // without this return the error can happen.
}
return res.json(data)
})
Node 버전 v10.16.0
및 Express 에서 테스트4.16.4
제 경우에는 문제를 일으키는 304 응답 (캐싱)이었습니다.
가장 쉬운 솔루션 :
app.disable('etag');
더 많은 제어가 필요한 경우 여기에 대체 솔루션 :
제 경우에는 componentWillUnmount
React 구성 요소 의 콜백 에서 채널 구독을 취소하지 않았을 때 React 및 postal.js에서 이런 일이 발생했습니다 .
여기에 오는 사람에게는 다른 솔루션이 도움이되지 않았습니다. 제 경우에는 이미지 업로드를 처리했지만 시간 초과를 처리하지 않은 경로에서 나타났습니다. 따라서 업로드가 너무 오래 걸리고 시간 초과 된 경우 콜백이 실행되었을 때 타임 아웃 응답이 전송 된 후 res.send ()를 호출하면 헤더가 이미 타임 아웃을 고려하도록 설정되어 있으므로 충돌이 발생했습니다.
이것은 매우 짧은 시간 제한을 설정하고 상당히 큰 이미지로 경로를 치는 것으로 쉽게 재현되었으며 매번 충돌이 재현되었습니다.
그냥 기댈뿐입니다. 이 함수를 통해 응답을 전달할 수 있습니다.
app.use(function(req,res,next){
var _send = res.send;
var sent = false;
res.send = function(data){
if(sent) return;
_send.bind(res)(data);
sent = true;
};
next();
});
이 미들웨어를 추가하면 작동합니다.
app.use(function(req,res,next){
var _send = res.send;
var sent = false;
res.send = function(data){
if(sent) return;
_send.bind(res)(data);
sent = true;
};
next();
});
이것은 응답이 클라이언트에게 전달되고 다시 응답을 시도 할 때 발생합니다. 이 오류를 일으키는 클라이언트에 다시 응답을 반환하는 곳에서 코드를 확인해야합니다. 반품을 원할 때 한 번 응답을 확인하고 반환하십시오.
nuxt 에서 왔고 , 문제는 구성 요소의 asyncData
메서드에 return
있었으며 데이터를 가져오고 헤더를 설정하는 것을 약속하는 것을 잊었습니다 .
Typescript에서 내 문제는 메시지를받은 후 웹 소켓 연결을 닫지 않았다는 것입니다.
WebSocket.on("message", (data) => {
receivedMessage = true;
doSomething(data);
localSocket.close(); //This close the connection, allowing
});
위의 도움을받지 못했다면 : for noobs이 오류의 원인은 요청을 여러 번 전송하기 때문입니다.
module.exports = (req,res,next)=>{
try{
const decoded = jwt.verify(req.body.token,"secret");
req.userData = decoded;
next();
}catch(error){
return res.status(401).json({message:'Auth failed'});
}
next();
}
`위에서 next ()를 두 번 호출하면 오류가 발생합니다.
router.delete('/:orderId', (req, res, next) => { Order.remove({_id:req.params.orderId},(err,data)=>{ if(err){ **res.status(500).json(err);** }else{ res.status(200).json(data); } *res.status(200).json(data);* }) })
여기에 응답은 두 번 보냅니다. 이미 응답을 보냈는지 확인하십시오.
약속을 중첩 할 때이 문제가 발생했습니다. promise 내부의 promise는 200을 서버로 반환하지만 외부 promise의 catch 문은 500을 반환합니다.이 문제를 수정하면 문제가 해결되었습니다.
제 경우에는 여러 콜백으로 인해 발생합니다. next()
코드 중에 메서드를 여러 번 호출했습니다.
코드가 단일 요청에 대해 여러 res.send () 문을 반환하는지 확인하십시오. 이 문제가 있었을 때처럼 ....
내 restify 노드 응용 프로그램 에서이 문제였습니다. 실수는
switch (status) { case -1: res.send(400); case 0: res.send(200); default: res.send(500); }
쉬지 않고 스위치를 사용하여 다양한 케이스를 처리하고있었습니다. 스위치 케이스에 익숙하지 않은 사람들은 중단없이 키워드를 반환한다는 것을 알고 있습니다. 케이스 아래의 코드와 그 다음 줄은 무슨 일이 있어도 실행됩니다. 따라서 단일 res.send를 보내고 싶지만이 실수로 인해 여러 res.send 문이 반환되어
오류는 클라이언트로 전송 된 후 헤더를 설정할 수 없습니다. 이것을 추가하거나 return res.send (200)과 같은 각 res.send () 메서드 앞에 return을 사용하여 해결되었습니다.
switch (status) { case -1: res.send(400); break; case 0: res.send(200); break; default: res.send(500); break; }
이 오류가 발생했을 때해야 할 일은 res.end ()뿐이었습니다.
auth.annonymousOnly = function(req, res, next) {
// add other task here
res.end();
};
직면 할 수있는 다른 문제는 res.json 및 res 뒤에 코드가 있다는 것입니다. 쓰다. 이 경우, 그 후 실행을 중지하려면 return을 사용해야합니다.
auth.annonymousOnly = function(req, res, next) {
if(!req.body.name)
{
res.json({error:"some error"});
return;
}
let comp = "value"; // this is the code after res.json which may cause some problems so you have to use return
};
이것은 더 많은 노드 일 가능성이 높습니다. 99 %의 경우 이중 콜백으로 인해 두 번 응답하거나 next () ing 두 번 등이 발생합니다. 내 문제가 루프 내에서 next ()를 사용하는 것이 해결되었습니다. 루프에서 next ()를 제거하거나 두 번 이상 호출을 중지하십시오.
이 오류는 2 개의 응답을 보낼 때 발생합니다. 예 :
if(condition A)
{
res.render('Profile', {client:client_});
}
if (condition B){
res.render('Profile', {client:client_});
}
}
어떤 이유로 조건 A와 B가 참이라면 두 번째로 render
오류가 발생 한다고 상상해보십시오.
참고 URL : https://stackoverflow.com/questions/7042340/error-cant-set-headers-after-they-are-sent-to-the-client
'Program Tip' 카테고리의 다른 글
분기는 어떻게 만듭니 까? (0) | 2020.10.02 |
---|---|
pip로 설치된 패키지 버전 찾기 (0) | 2020.10.02 |
마스터에서 Git 브랜치 업데이트 (0) | 2020.10.02 |
문자열 목록에서 빈 문자열 제거 (0) | 2020.10.02 |
모든 예외 포착 정보 (0) | 2020.10.02 |