programing

Node.js를 사용하여 복잡한 JSON 응답을 반환하는 방법

showcode 2023. 3. 26. 11:55
반응형

Node.js를 사용하여 복잡한 JSON 응답을 반환하는 방법

nodejs 및 express를 사용하여 JSON을 사용하여 하나 또는 여러 개체(어레이)를 반환하고 싶습니다.아래 코드에서는 JSON 오브젝트를 1개씩 출력합니다.작동은 하지만 이건 내가 원하는 게 아니야.오브젝트가 많기 때문에 생성된 응답은 유효한 JSON 응답이 아닙니다.

어레이에 모든 개체를 추가하고 특정 어레이를 res.end로 반환하기만 하면 된다는 것을 잘 알고 있습니다.다만, 처리나 메모리의 부하가 높을 가능성이 있습니다.

nodej를 사용하여 이 문제를 해결하는 적절한 방법은 무엇입니까?query.는 각각 올바른 호출 방식입니까?

app.get('/users/:email/messages/unread', function(req, res, next) {
    var query = MessageInfo
        .find({ $and: [ { 'email': req.params.email }, { 'hasBeenRead': false } ] });

    res.writeHead(200, { 'Content-Type': 'application/json' });   
    query.each(function(err, msg) {
        if (msg) { 
            res.write(JSON.stringify({ msgId: msg.fileName }));
        } else {
            res.end();
        }
    });
});

express 3에서는 res.json({foo:bar})을 직접 사용할 수 있습니다.

res.json({ msgId: msg.fileName })

매뉴얼을 참조

이것이 실제로 다른지는 모르겠지만 쿼리 커서 위에 반복하는 것이 아니라 다음과 같은 작업을 수행할 수 있습니다.

query.exec(function (err, results){
  if (err) res.writeHead(500, err.message)
  else if (!results.length) res.writeHead(404);
  else {
    res.writeHead(200, { 'Content-Type': 'application/json' });
    res.write(JSON.stringify(results.map(function (msg){ return {msgId: msg.fileName}; })));
  }
  res.end();
});

[편집] Mongoose 문서를 확인하면 각 쿼리 결과를 별도의 청크로 전송할 수 있습니다.Web 서버는 기본적으로 청크 전송 인코딩사용하기 때문에 유효한 JSON 개체를 만들기 위해 항목을 배열로 감싸기만 하면 됩니다.

대략적인 (테스트되지 않은)

app.get('/users/:email/messages/unread', function(req, res, next) {
  var firstItem=true, query=MessageInfo.find(/*...*/);
  res.writeHead(200, {'Content-Type': 'application/json'});
  query.each(function(docs) {
    // Start the JSON array or separate the next element.
    res.write(firstItem ? (firstItem=false,'[') : ',');
    res.write(JSON.stringify({ msgId: msg.fileName }));
  });
  res.end(']'); // End the JSON array and response.
});

또는 말씀하신 대로 어레이 콘텐츠를 그대로 전송할 수도 있습니다.경우 응답 본문이 버퍼링되어 즉시 전송됩니다.이 경우 결과 세트에 필요한 메모리보다 많은 메모리가 대량으로 소비될 수 있습니다.예를 들어 다음과 같습니다.

// ...
var query = MessageInfo.find(/*...*/);
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify(query.map(function(x){ return x.fileName })));

언급URL : https://stackoverflow.com/questions/8905613/how-to-return-a-complex-json-response-with-node-js

반응형