mongoDB和Express

时间:2018-06-01 11:36:23

标签: javascript node.js express

我收到一条消息请求尚未完成,如果我在我的应用中修补和删除请求(帖子和获取请求工作正常),则不会发送任何数据

以下是我的要求

在服务中(前面,Angular 4)我创建了请求

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

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

然后在组件中调用它们           this.deleteData(this.checkedItems);

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

服务

PATCH 请求通过console.log获取req.body - 所以它应该有效,但它不会

DELETE 请求无法获取任何数据! req.body是空的!但我需要传递id数组,所以我不能通过params来做。

你能帮我或暗示一下吗?这是我的服务

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}`));

1 个答案:

答案 0 :(得分:1)

您需要在处理完请求后关闭连接,否则客户端将等待服务器发送响应,直到达到请求超时。

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);
  });
});

至于DELETE请求没有req.body,这是因为Angular 4的http客户端不允许DELETE请求的正文。其DELETE请求的API如下所示:this.http.delete(url, httpOptions),没有正文支持。如果需要发送一组id,则必须使用查询参数。查询参数确实支持数组,它们看起来像这样:https://myurl.xyz/tasks?ids[]=1&ids[]=2&ids[]=3
https://angular.io/guide/http#url-parameters