-1

I am making a quite easy CRUD application in MEAN stack. I have succesfully done all but Update function. Problem is not with request itself but inability of Node server to respond. Request is making changes to database as requested and I even eget a { n: 1, nModified: 0, ok: 1 } response from mongojs. However, I am unable to send it back to Angular frontend. I try res.json() but it won't all allow me as it is a not a function? But I am succesfuly doing res.json in create, delete and read. In network tab in developers console, request seems to be pending and after like 30 seconds it throws an error. No luck with postman either. How can I send a response to frontend?

// Error handling
const sendError = (err, res) => {
  response.status = 501;
  response.message = typeof err == 'object' ? err.message : err;
  res.status(501).json(response);
};

// Response handling
let response = {
  status: 200,
  data: [],
  message: null
};


 // Update log <-- doesn't send response but works

router.put('/update/:id', (req, body, res) => {
  console.log("Received UPDATE request");
  console.log(req.params.id);
  const bodyToUpdate = {
    '_id': mongojs.ObjectId(req.params.id),
    'week': req.body.week,
    'type': req.body.type,
    'text': req.body.text,
    'days': req.body.days
  };
  console.log(bodyToUpdate);
  db.logs.update({
    _id: mongojs.ObjectId(req.params.id)}, bodyToUpdate, (err, res) => {
    if (err) return next(err);
    response.data = res;
    res.json(response);
    console.log(response);
  });
});


// Delete log <--does work without problems

router.post('/delete/:id', (req, res) => {
  console.log("Received DELETE request");
  console.log(req.params.id);
  db.logs.remove({
    _id: mongojs.ObjectId(req.params.id)}, (err, users) => {
    if (err) return next(err);
    console.log(response);
    response.data = users;
    res.json(response);
  });
});

Service API frontend

 deleteLog(id) {
    return new Promise((resolve, reject) => {
      this._http.post('/api/delete/' + id , id)
        .map(res => res.json())
        .subscribe(res => {
          resolve(res);
          console.log(res);
        }, (err) => {
          reject(err);
        });
    });
  }

  updateLog(logToUpdate) {
    return new Promise((resolve, reject) => {
      this._http.put('/api/update/' + logToUpdate._id, logToUpdate)
        .map(res => res.json())
        .subscribe(res => {
          resolve(res);
          // console.log(res);
        }, (err) => {
          reject(err);
        });
    });
  }
Jack Sylvane
  • 59
  • 2
  • 8

1 Answers1

0

As @JithinSebastian correctly pointed out - I should not have 3 arguments in put request. I also had to change name of callbacks in mongo update function because I already used res in router function callback.

// Update log
router.put('/update/:id', (req, res) => {
  console.log("Received UPDATE request");
  console.log(req.body);
  const bodyToUpdate = {
    '_id': mongojs.ObjectId(req.params.id),
    'week': req.body.week,
    'type': req.body.type,
    'text': req.body.text,
    'days': req.body.days
  };
  db.logs.update({
    _id: mongojs.ObjectId(req.params.id)
  }, bodyToUpdate, (err, logs) => {
    if (err) return next(err);
    response.data = logs;
    res.json(response);
    console.log(response);
  });
});
Jack Sylvane
  • 59
  • 2
  • 8