[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

https://github.com/ddopson/underscore-cli


답변

도우미를 만들 수 있습니다 : 응용 프로그램의 어느 곳에서나 사용할 수 있도록 도우미 기능 만들기

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
    }
      ]
}