Отправьте массив JSON в ответ от Node.js - PullRequest
0 голосов
/ 28 февраля 2020

Я получаю данные из базы данных MongoDB, затем помещаю их в курсор, чтобы отправить их как ответ Node.js.

var router = express.Router();
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost/EmployeeDB';
/* GET users listing. */
router.get('/', function(req, res, next) {
  //res.send('respond with a resource');
  MongoClient.connect(url, function(err, db) {
    var cursor = db.collection('Employee').find();
    cursor.each(function(err, doc) {

      console.log(doc);
      arrayres = doc ;
     res.send(doc);

    });
    db.close();
  });
});

module.exports = router;

Он отправляет только первую запись, затем я получаю эту ошибку:

Error [ERR_HTTP_HEADERS_SENT]: Cannot remove headers after they are sent to the client
    at ServerResponse.removeHeader (_http_outgoing.js:528:11)
    at ServerResponse.send 

Примечание: я получаю эту ошибку, только когда есть несколько записей для отправки в качестве ответа.

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Вы отправляете ответ дважды. Что невозможно (посмотрите на Почему мы не можем сделать несколько ответов.отправить в Express. js? )

  res.send('respond with a resource');

Здесь и

res.send(arrayres);

Здесь.

Вот рабочий пример, основанный на ответе Джереми:

router.get('/', function (req, res, next) {
    MongoClient.connect(url, function (err, db) {
        var cursor = db.collection('Employee').find();

        let employees = []
        const pushData = async () => {
            cursor.forEeach( function (doc) {
                employees.push(doc);
            });
        }
        const sendResponse = async () => {
            await pushData();
            res.json(employees);
        }
    });
});
0 голосов
/ 28 февраля 2020

Вы можете отправить обратно только один ответ в браузер (будь то res.send(), res.end(), res.sendFile(), res.json() или любой другой). Таким образом, вы не можете иметь это внутри .forEach().

Сначала создайте массив, затем отправьте данные обратно один раз.

router.get('/', function (req, res, next) {
    MongoClient.connect(url, function (err, db) {
        var cursor = db.collection('Employee').find();

        let employees = []

        cursor.forEeach( function (doc) {
            employees.push(doc);
        });

        res.json(employees);
    });
});

Или с Пн goose:

Employee.find().lean().exec( (err,docs) => res.json(docs))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...