[json] node 또는 Express를 사용하여 JSON을 반환하는 올바른 방법
따라서 다음 JSON 객체를 가져 오려고 시도 할 수 있습니다.
$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=ISO-8859-1
Date: Wed, 30 Oct 2013 22:19:10 GMT
Server: Google Frontend
Cache-Control: private
Alternate-Protocol: 80:quic,80:quic
Transfer-Encoding: chunked
{
"anotherKey": "anotherValue",
"key": "value"
}
$
node 또는 express를 사용하여 서버의 응답에서 정확히 동일한 본문을 생성하는 방법이 있습니까? 분명히 헤더를 설정하고 응답의 내용 유형이 “application / json”이 될 것임을 나타낼 수 있지만 객체를 쓰거나 보내는 다른 방법이 있습니다. 내가 일반적으로 사용하는 것으로 보았던 것은 다음 형식의 명령을 사용하는 것입니다.
response.write(JSON.stringify(anObject));
그러나 여기에는 “문제”인 것처럼 논쟁 할 수있는 두 가지 사항이 있습니다.
- 우리는 문자열을 보내고 있습니다.
- 또한 결국 줄 바꿈 문자가 없습니다.
또 다른 아이디어는 다음 명령을 사용하는 것입니다.
response.send(anObject);
이것은 위의 첫 번째 예와 비슷한 curl의 출력을 기반으로 JSON 객체를 보내는 것으로 보입니다. 그러나 터미널에서 curl을 다시 사용하는 경우 본문 끝에 줄 바꿈 문자가 없습니다. 그렇다면 실제로 노드 또는 노드 / 표현을 사용하여 끝에 줄 바꿈 문자를 추가하여 실제로 이와 같은 것을 작성할 수 있습니까?
답변
응답이 문자열 인 경우, 응답을 미리 보내려면 어색한 이유로 다음과 같은 것을 사용할 수 있습니다 JSON.stringify(anObject, null, 3)
Content-Type
헤더도로 설정하는 것이 중요합니다 application/json
.
var http = require('http');
var app = http.createServer(function(req,res){
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ a: 1 }));
});
app.listen(3000);
// > {"a":1}
확인 됨 :
var http = require('http');
var app = http.createServer(function(req,res){
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ a: 1 }, null, 3));
});
app.listen(3000);
// > {
// > "a": 1
// > }
왜 줄 바꿈으로 끝내고 싶은지 확실하지 않지만 그냥 할 수 있습니다. JSON.stringify(...) + '\n'
달성하기 위해 .
표현하다
명시 적으로 대신 옵션 을 변경하여 이를 수행 할 수 있습니다 .
'json replacer'
JSON 대체 콜백, 기본적으로 null
'json spaces'
형식화를위한 JSON 응답 공간, 개발시 기본값은 2, 프로덕션시 0
실제로 40으로 설정하지 않는 것이 좋습니다
app.set('json spaces', 40);
그런 다음 json으로 응답 할 수 있습니다.
res.json({ a: 1 });
'json spaces
‘구성을 사용하여 이를 확인합니다.
답변
Express.js 3x부터 응답 객체에는 json () 메소드가있어 모든 헤더를 올바르게 설정하고 JSON 형식으로 응답을 반환합니다.
예:
res.json({"foo": "bar"});
답변
JSON 파일을 보내려고하면 스트림을 사용할 수 있습니다
var usersFilePath = path.join(__dirname, 'users.min.json');
apiRouter.get('/users', function(req, res){
var readable = fs.createReadStream(usersFilePath);
readable.pipe(res);
});
답변
이 res.json()
기능 은 대부분의 경우 충분해야합니다.
app.get('/', (req, res) => res.json({ answer: 42 }));
res.json()
기능 변환 매개 변수는 사용하여 JSON에 전달 JSON.stringify()
하고 세트 Content-Type
헤더 에 application/json; charset=utf-8
클라이언트가 자동으로 응답을 구문 분석 알고 HTTP 있도록.
답변
Express를 사용하는 경우 다음을 사용할 수 있습니다.
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({key:"value"}));
아니면 그냥
res.json({key:"value"});
답변
파이프와 여러 프로세서 중 하나를 사용하여 미리 확인할 수 있습니다. 앱은 항상 가능한 한 적은 부하로 응답해야합니다.
$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue | underscore print
답변
도우미를 만들 수 있습니다 : 응용 프로그램의 어느 곳에서나 사용할 수 있도록 도우미 기능 만들기
function getStandardResponse(status,message,data){
return {
status: status,
message : message,
data : data
}
}
여기에 모든 주제를 얻으려는 주제 경로가 있습니다.
router.get('/', async (req, res) => {
const topics = await Topic.find().sort('name');
return res.json(getStandardResponse(true, "", topics));
});
우리가 얻는 반응
{
"status": true,
"message": "",
"data": [
{
"description": "sqswqswqs",
"timestamp": "2019-11-29T12:46:21.633Z",
"_id": "5de1131d8f7be5395080f7b9",
"name": "topics test xqxq",
"thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575031579309.jpg",
"category_id": "5de0fe0b4f76c22ebce2b70a",
"__v": 0
},
{
"description": "sqswqswqs",
"timestamp": "2019-11-29T12:50:35.627Z",
"_id": "5de1141bc902041b58377218",
"name": "topics test xqxq",
"thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575031835605.jpg",
"category_id": "5de0fe0b4f76c22ebce2b70a",
"__v": 0
},
{
"description": " ",
"timestamp": "2019-11-30T06:51:18.936Z",
"_id": "5de211665c3f2c26c00fe64f",
"name": "topics test xqxq",
"thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575096678917.jpg",
"category_id": "5de0fe0b4f76c22ebce2b70a",
"__v": 0
},
{
"description": "null",
"timestamp": "2019-11-30T06:51:41.060Z",
"_id": "5de2117d5c3f2c26c00fe650",
"name": "topics test xqxq",
"thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575096701051.jpg",
"category_id": "5de0fe0b4f76c22ebce2b70a",
"__v": 0
},
{
"description": "swqdwqd wwwwdwq",
"timestamp": "2019-11-30T07:05:22.398Z",
"_id": "5de214b2964be62d78358f87",
"name": "topics test xqxq",
"thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575097522372.jpg",
"category_id": "5de0fe0b4f76c22ebce2b70a",
"__v": 0
},
{
"description": "swqdwqd wwwwdwq",
"timestamp": "2019-11-30T07:36:48.894Z",
"_id": "5de21c1006f2b81790276f6a",
"name": "topics test xqxq",
"thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575099408870.jpg",
"category_id": "5de0fe0b4f76c22ebce2b70a",
"__v": 0
}
]
}