Методы цепной экспресс

1

У меня есть Express-сервер с методами CRUD

Я хотел бы, чтобы при запуске post или put or delete метод get также запускался сразу после того, как просмотр обновился на моей лицевой стороне

Здесь мой route.js код

// ROUTES FOR OUR API
// =============================================================================
var express = require("express"); // call express
var NouvProj = require("../app/models/nouvProj");
var mongoose = require("mongoose");

var router = express.Router(); // get an instance of the express Router

router.use(function(req, res, next) {
  next(); // make sure we go to the next routes and don't stop here
});

// test route to make sure everything is working (accessed at GET http://localhost:8080/api)
router
  .route("/projets")

  // create a nouvProj (accessed at POST http://localhost:8080/api/nouvProjs)
  .post(function(req, res, next) {
    var nouvProj = new NouvProj();
    // create a new instance of the nouvProj model

    nouvProj.nomProj = req.body.nomProj;
    nouvProj.leadProj = req.body.leadProj;
    nouvProj.descProj = req.body.descProj;
    nouvProj.BesProj = req.body.BesProj;
    nouvProj.pers = req.body.pers;
    nouvProj.backlog.fonctionnalite = req.body.Fonctionnalite;
    nouvProj.backlog.userStory = req.body.UserStory;
    // save the nouvProj and check for errors
    nouvProj.save(function(err) {
      if (err) {
        res.send(err);
        console.log("err");
      }
      res.json({
        message: "nouvProj created!"
      });
    });
    next();
  })

  .get(function(req, res) {
    NouvProj.find(function(err, nouvProj) {
      if (err) res.send(err);
      else {
        res.json(nouvProj);
        console.log(req.io);
      }
    });
  });
router
  .route("/nouvProjs/:nouvProj_id")

  // get the nouvProj with that id (accessed at GET http://localhost:8080/api/nouvProjs/:nouvProj_id)
  .get(function(req, res) {
    //console.log(req.params.nouvProj_id);
    NouvProj.findById(req.params.nouvProj_id, function(err, nouvProj) {
      if (err) {
        res.send(err);
      } else {
        //console.log(nouvProj);

        res.json(nouvProj);
      }
    });
  })
  .put(function(req, res) {
    NouvProj.findById(req.params.nouvProj_id, function(err, nouvProj) {
      if (err) res.send(err);
      nouvProj.nomProj = req.body.nomProj;
      nouvProj.leadProj = req.body.leadProj;
      nouvProj.descProj = req.body.descProj;
      nouvProj.BesProj = req.body.BesProj;
      nouvProj.pers = [{ name: req.body.name, poste: req.body.poste }];
      nouvProj.backlog.fonctionnalite = req.body.Fonctionnalite;
      nouvProj.backlog.userStory = req.body.UserStory;

      nouvProj.save(function(err) {
        if (err) res.send(err);

        res.json({
          message: "nouvProj updated!"
        });
      });
    });
  })

  .delete(function(req, res) {
    NouvProj.remove(
      {
        _id: req.params.nouvProj_id
      },
      function(err, nouvProj) {
        if (err) res.send(err);

        res.json({
          message: "Successfully deleted"
        });
      }
    );
  });
module.exports = router;

Без next() промежуточного программного обеспечения мое приложение отправляет и получает данные. но когда я добавляю next():

Error: Can't set headers after they are sent.

начиная с этой части кода:

  res.json({
    message: "nouvProj created!"
  });
});
next();

Как я могу решить эту проблему и уметь обновлять метод get каждый добавление данных?

  • 0
    Вы пытаетесь передать данные из одной функции промежуточного программного обеспечения в другую?
  • 0
    Я хотел бы создать поток данных, выполнить get метод после каждого post выполнения
Теги:
express

2 ответа

1

Вы не можете вызвать res.send() res.json() res.render() и т.д. В функции промежуточного программного обеспечения перед вызовом next(). Экспресс останавливает выполнение цепочки после вызова ответа.

Если вы хотите "цепочки" ответов, вы можете использовать библиотеку, например request (https://www.npmjs.com/package/request), чтобы испустить несколько HTTP-вызовов. Здесь один из примеров по умолчанию:

request
  .get('http://example.com/img.png')
  .on('response', function(response) {
    console.log(response.statusCode) // 200
    console.log(response.headers['content-type']) // 'image/png'
  })
  .pipe(request.put('http://example.com/img.png'))
  • 0
    Я не знаю, поняли ли вы, чего я хочу. Я бы создал своего рода поток, когда при добавлении данных обновляю метод get, чтобы моя передняя структура могла прослушивать изменения.
1

Вы не можете отправлять несколько ответов на один запрос, что просто не работает HTTP, и почему вы получаете сообщение об ошибке, которую вы получаете.

Есть два способа, которыми большинство людей используют API-интерфейсы, подобные этому. Либо просто верните объект с ответом POST (например, res.json({ message: 'Success!', project: nouvProj });), либо попросите клиента выполнить запрос GET после получения ответа на успех.

  • 0
    Я думаю, что первый способ более уместен, потому что нет необходимости в еще одном запросе.
  • 0
    @tariklefi Это действительно зависит от того, что происходит за кулисами. Если постоянство - это то, что может занять некоторое время (например, обработка видео и т. П.), Лучше просто ответить, что вы его получили, возможно, предоставить ссылку на то, где оно в конечном итоге будет, а затем позволить клиенту найти его позже.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню