Anna F
Anna F

Reputation: 1683

Request is not finished yet error with mongoDB and Express

I get a message Request is not finished yet and no data will be sent, if I do patch and delete requests in my app ( the post and get request work well)

Here are my requests

In service (front, Angular 4) I create the requests

  api = 'http://localhost:3000/tasks';
  deleteData(id) {
    return this.http.delete( this.api, id);
  }

  patch(data) {
    return this.http.patch( this.api, data);
  }

And then call them in component this.deleteData(this.checkedItems);

 this.service.patch(result.data).subscribe(d => {
            this.tasks = d;
          });

The service

The PATCH request get req.body via console.log - so it should works, but it doesn't

The DELETE request doesn't get any data! The req.body is empty! But I need to pass the array of ids, so I can't do it via params.

Could you please help me or give a hint? Here is my service

const express = require('express');
const path = require('path');
const http = require('http');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const cors = require('cors');
var Schema = mongoose.Schema;

const app = express();
//Middleware for CORS
app.use(cors());
app.use(express.json());

// Parsers for POST data
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

// Point static path to dist
app.use(express.static(path.join(__dirname, 'dist')));

  var todoSchema = new Schema({
    taskName: String,
    createdAt: Date,
    isDone: Boolean,
    prioraty: String
  }, {
    collection: 'tasks'
  });

var Model = mongoose.model('Model', todoSchema);
//replace when DB is online
mongoose.connect('mongodb://localhost:27017/admin').then(() => {
  console.log("connected");
}).catch (() => {
  console.log("not connected");
});
mongoose.connection.once('open', function () {
  console.log('mongodb connected.');
});

app.patch('/tasks', function (req, res) {
  console.log(req.body);
  var updateObject = {
    'taskName': req.body.taskName,
    'isDone': req.body.isDone,
    'prioraty': req.body.prioraty
  }
  var id = req.body._id;
  Model.collection.update({_id  : id}, {$set: updateObject});
});

app.delete('/tasks', function(req,res){
  console.log('Delete', req.body);
  var ids = [];
  for (let i = 0; i < req.body.length; i ++) {
    ids.push(req.body[i]._id);
  }
  var myquery = { _id: { $in: ids } };
  Model.collection.deleteMany(myquery, function(err, obj) {
    if (err) throw err;
  });
});

const port = process.env.PORT || '3000';
app.set('port', port);

/**
 * Create HTTP server.
 */
const server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */
server.listen(port, () => console.log(`API running on localhost:${port}`));

Upvotes: 0

Views: 3066

Answers (1)

Sven
Sven

Reputation: 5265

You need to close the connection when you're done handling the request, otherwise the client will wait for the server to send a response until the request timeout is reached.

app.patch('/tasks', function (req, res) {
  ...
  Model.collection.update({_id  : id}, {$set: updateObject}, function (err) {
    if (err) {
      console.error(err);
      return res.sendStatus(500);
    }
    res.sendStatus(200);
  });
});

app.delete('/tasks', function(req,res){
  ...
  Model.collection.deleteMany(myquery, function(err) {
    if (err) {
      console.error(err);
      return res.sendStatus(500);
    }
    res.sendStatus(200);
  });
});

As for the DELETE request not having a req.body, that's because Angular 4's http client doesn't allow a body for DELETE requests. Its API for DELETE requests looks like this: this.http.delete(url, httpOptions), with no body support. You'll have to use query parameters if you need to send an array of ids. Query params does support arrays, they look something like this: https://myurl.xyz/tasks?ids[]=1&ids[]=2&ids[]=3
See https://angular.io/guide/http#url-parameters

Upvotes: 1

Related Questions