【问题标题】:Express node.js with mongoose CRUD strange behavior.用猫鼬 CRUD 奇怪的行为表达 node.js。
【发布时间】:2014-06-28 04:22:44
【问题描述】:

我正在用 NodeJS 开始我的冒险。我选择了带有 mongoose 数据库的 express web 框架。作为我前端的一部分,我正在使用 AngularJS。

首先是前端,传递给/api/user的基本表单参数。

$scope.form = {};
  $scope.submitUser = function () {
    console.log($scope.form);
    $http.post('/api/user', $scope.form).
      success(function(data) {})
      .error(function(data) {});
  };

$scope.form 等于:

Object {name: "foo", surname: "bar", email: "foobar@bar.foo"} 

然后我们得到了后端,我从默认用户架构开始:

var userSchema = new mongoose.Schema({
  name : String,
  surname : String,
  email : String
});

var User = mongoose.model('User', userSchema);

还有 api 后处理程序:

app.post('/api/user', function (req, res) {
  User.create({
    name : req.name,
    surname : req.surname,
    done : false
    }, function(err, user) {
      if (err)
        res.send(err);
      res.json(user);
    });
});

结果不是对象,而是带有 __v 的 id:

__v: 0
_id: "536e218351b1182d0f000001"

PS。这很神奇,我完全不知道为什么会这样: __v 和 _id 之上的那些记录不会保存在任何地方(显示集合,并且 find() 在每个结果中为空)。但是当我运行时

User.find(function(err, users) {
  if (err)
    res.send(err)
  res.json(users);

我得到的记录很少(以前尝试传递此表单)是 __v 和 _id。

连接如下所示:

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost:1/test');

感谢任何提示,对此进行解释。对不起,我缺乏知识,但我真的试过了。

祝你有美好的一天! ;)

【问题讨论】:

    标签: node.js angularjs mongodb express mongoose


    【解决方案1】:

    在我的情况下它不起作用。为什么?

    我从 req.body.name

    获得价值

    如果我记录它 console.log(req.body.name); 我会在控制台上获得值。

    POST: 
    { name: 'typing any name', status: null }
    typing any name
    

    所以我的前端 (angular.js)、表单和后端 (node.js、express、mongoose) 之间的工作流程似乎有效。现在我 POST 值,但在我的 mongoDB 中得到一个空对象。

    {"_id":"543a50a974de6e2606bd8478","__v":0}

    app.post('/api/offers', function (req, res){
    var offer;
    console.log("POST: ");
    console.log(req.body);
    console.log(req.body.name);
    offer = new OfferModel({
     name: req.body.name,
     value: req.body.value,
     title: req.body.title,
     content: req.body.content,
    });
    offer.save(function (err) {
     if (!err) {
        return console.log("created offer" + req.body.name);
      } else {
        return console.log(err);
      }
    });
     return res.send(offer);
    });
    

    这是模型:

    var offerSchema = mongoose.Schema({
    
        offer            : {
                name        : String,
                value       : String,
                title       : String,
                content     : String,
                image       : String,
                start       : String,
                end         : String,
                targets     : String,
                beacons     : String,
                published   : String
        }
     });
     var OfferModel = mongoose.model('Offer', offerSchema);
    

    【讨论】:

      【解决方案2】:

      假设您在 POST 的主体(有效负载)中从客户端发送 json 对象,服务器应该以 req.body.name 的形式访问该值,而不是 req.name

      app.post('/api/user', function (req, res) {
          User.create({
              name : req.body.name,
              surname : req.body.surname,
              done : false
          }, function(err, user) {
            if (err)
              res.send(err);
            res.json(user);
          });
      });
      

      确保你通过 body-parser 中间件来表达:

      var express = require('express')
      var app = express()
      app.use(express.bodyParser());  // for express 3.x
      

      或用于 express 4.x

      var express    = require('express')
      var bodyParser = require('body-parser')
      var app = express()
      app.use(bodyParser());  // for express 4.x
      

      【讨论】:

      • 谢谢!我几乎 99% 确定这是数据库问题,而不是缺少正确的请求解析。另外,我发现了我的#PS 问题。当我使用 >mongo 访问我的数据库的 shell 时,我没有定义端口 >mongo --port X 是访问有效数据库的正确方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      相关资源
      最近更新 更多