【问题标题】:HTTP Post not connecting with angularHTTP Post没有与角度连接
【发布时间】:2015-08-09 09:11:35
【问题描述】:

我是堆栈新手,正在构建一个测试页面,以便在构建我的实际项目之前整理我的理解。现在,我只是试图接受用户输入,将其保存到数据库中,然后打印出来。数据应保存在基本的猫鼬模型中,测试。虽然所有路线都打开了,但它不会打印用户输入的内容,而是按以下格式打印内容:

{"_id":"55c3925b48b9dba0d896be40","__v":0}

我怀疑它与 index.js 中这个 sn-p 的第二行有关:

router.post('/survey', function(req, res, next) {
    var test = new Test(req.body);

    test.save(function(err,test) {
        if(err) {
            return next(err);
        }

        res.json(test);
    });
});

module.exports = router;

相关代码:

所有 index.js:

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

//set up routes
var mongoose = require('mongoose');
var Test = mongoose.model('Test');

router.get('/survey', function(req, res, next) {
    Test.find(function(err, tests) {
        if(err) {
          return next(err);
        }

        res.json(tests);
    });
});

router.post('/survey', function(req, res, next) {
    var test = new Test(req.body);

    test.save(function(err,test) {
        if(err) {
            return next(err);
        }

        res.json(test);
    });
});

module.exports = router;

Tests.js(模型):

var mongoose = require('mongoose');

var TestSchema = new mongoose.Schema({
    'name': String,
});

module.exports = mongoose.model('Test', TestSchema);

角码相关位:

routerApp.factory('tests', ['$http', function($http){
    var o = {
        tests: []
    };

    o.getAll = function() {
        return $http.get('/survey').success(function(data){
            console.log('get all sees data as:' + data);
            angular.copy(data, o.tests);
        });
    };

    o.create = function(test) {
        console.log('create sees test as' + test);
        return $http.post('/survey', test).success(function(data){
            o.tests.push(data);
            console.log('Data:' + data);
        });
    };

    return o;
}]);


routerApp.controller('FormCtrl', ['$scope', 'tests',
    function($scope, tests){
        $scope.test = tests.tests;

        $scope.addTest = function(){
            if(!$scope.text || $scope.text === '') { return; }
            tests.create({
                name: $scope.text
            });
            $scope.text = '';
        };
    }
]);

我怀疑这是不了解 req 是什么类型的对象的问题,但我并不完全肯定。我该如何让这段代码以猫鼬模型中描述的格式保存数据?

【问题讨论】:

  • 可能更容易分离关注点——例如,以隔离的方式开发/测试服务器端逻辑,仅使用curl(或准系统网页)将数据发布到它。然后专注于之后的角度/客户端代码。我确实认识到 JSON 中的“_id”键值对:它是在将新文​​档插入 MongoDB 时自动生成的文档 id,因此显然正在插入一些东西,至少
  • 这绝对是 POST 错误。我可以进入 mongo shell 并且肯定正在创建文档。某处来自 $scope 的信息不会进入 $save;我只是不太确定在哪里。
  • @lispHK01,刚刚用curl添加了一个文档,它没有保存我使用的任何属性,而是以{i​​d,v}的格式保存--所以在POST方法中本身。
  • 如果我明确定义 test (即 var test = new Test ({"name":"test"});) 它确实保存了属性,所以它是 req.body 语句导致问题。
  • hmm,我唯一能想到的可能是 req.body 的值需要被解析——即,确保可能看起来像“name=foo”的原始正文被转换为真正的 JavaScript 对象,例如 {name: 'foo'},当它被传递到 Test 构造函数时。

标签: angularjs node.js mongodb mongoose


【解决方案1】:

如果您在文档对象 (res.json(test.toObject())) 上调用 .toObject(),您应该得到一个包含该文档中数据的普通对象。

【讨论】:

  • 当我这样做时它似乎没有运行......还有其他想法吗?
【解决方案2】:

尝试console.log(req.body)。如果它是空的,那么在定义路由之前尝试在某处添加app.use(bodyParser.json())(并确保先使用 npm 和require 安装它)。

当您发布某种 JSON 时,默认情况下它在 req.body 中不可用。您需要bodyParser 来解析传入的数据并使其在req.body 中可用。请参阅https://medium.com/@adamzerner/how-bodyparser-works-247897a93b90 了解更多信息。

【讨论】:

    猜你喜欢
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2016-02-16
    相关资源
    最近更新 更多