У меня есть 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
каждый добавление данных?
Вы не можете вызвать 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'))
Вы не можете отправлять несколько ответов на один запрос, что просто не работает HTTP, и почему вы получаете сообщение об ошибке, которую вы получаете.
Есть два способа, которыми большинство людей используют API-интерфейсы, подобные этому. Либо просто верните объект с ответом POST (например, res.json({ message: 'Success!', project: nouvProj });
), либо попросите клиента выполнить запрос GET после получения ответа на успех.
get
метод после каждогоpost
выполнения