【问题标题】:Post Request from express to mongoDB从 express 向 mongoDB 发布请求
【发布时间】:2018-05-30 13:10:58
【问题描述】:

我正在尝试使用 Express 将信息发布到 mongoDB。所有与数据库的连接都工作正常,因为 get Request 工作

在我的 server.js 中,我定义了架构

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

var Model = mongoose.model('Model', todoSchema);

然后是app.post请求

app.post('/tasks', function(req, res) {
  var savedata = new Model({
    'taskName': req,
    'isDone': false,
    'createdAt': Date.now(),
    'prioraty': 'medium'
  }).save(function (err, result) {
    if (err) throw err;

    if (result) {
      res.json(result)
    }
  })
});

这根本不起作用......

在我的前端,我通过按下按钮来调用它,但没有任何反应..

  postTask(task) {
    return this.http.post('http://localhost:3000/tasks', task);
  }

我该如何解决?如前所述,GET 请求工作正常,所以我希望我是在正确的方式...

所以这里以获取请求为例

app.get('/tasks', (req, res) => {
  Model.find({
   // 'request': query
  }, function(err, result) {
    if (err) throw err;
    if (result) {
      res.json(result)
    } else {
      res.send(JSON.stringify({
        error : 'Error'
      }))
    }
     })
    });

【问题讨论】:

  • 你是Subscribing在组件里的吗
  • 您使用的是哪个版本的angular?你应该subscribe你的post request
  • 添加POST 请求的错误消息以及您在发布请求中发送的task 对象的示例很有帮助。

标签: angular mongodb express


【解决方案1】:

查看您的POSTtaskName 是一个基于您的模式的字符串,但您将完整的req 对象传递给它。 req.body 中的属性应该与 req.body.taskName 类似,如果这是您在请求中传递的内容。

【讨论】:

    【解决方案2】:

    首先您需要在前端收到您的回复

    服役中:

    postTask(task) {
        return this.http.post('http://localhost:3000/tasks', task);
    }
    

    如果您使用的是angularjs(angular 1+)

    您需要使用thencatch 来接收response

    在控制器中:

    this.service.postTask(task).then(function(response) {
        console.log(response)
    }).catch(function(error) {
        console.log(error)
    })
    

    如果您使用的是angular(angular 2+)

    您需要使用subscribe,因为this.http 返回observable

    在组件中:

    this.service.postTask(task).subscribe( response => {
        console.log(response)
    })
    

    第二,正如@andrew 提到的,

    taskName 你应该发送string 因为你有taskName 架构string

    var todoSchema = new Schema({
        taskName: String,
    })
    

    更新:

    req.body 包含请求中提交的数据键值对 身体。默认情况下,它是未定义的,并在您使用时填充 body-parser等body-parser中间件

    以下示例显示如何使用body-parsing middleware 填充req.body

    var app = require('express')();
    var bodyParser = require('body-parser');
    
    app.use(bodyParser.json()); // for parsing application/json
    app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
    
        app.post('/tasks', function(req, res) {
           console.log(req.body)
        });
    

    Here is Documentation of body-parser

    【讨论】:

    • 谢谢!它帮了很多忙,还有一个问题 - 我的请求正文现在是空的......那么我该如何解决这个问题? 'taskName': req, 例如,如果我写 'taskName':"test3",它工作正常,但我不能从函数传递参数
    • 你能控制台req.body,试试req.body.taskName
    • req.params,如果你console.log(req),你会知道现在有什么
    • 您需要使用bodyParser 获取req.body 请查看更新后的答案。你需要npm install body-parser --save
    • 我已经在使用它了...如果我尝试控制台 req.body,我的 console.log 给了我空对象 {}
    猜你喜欢
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多