Error: data and salt arguments required (User input object from angular not being received by node?)

Error: data and salt arguments required (User input object from angular not being received by node?)

我是 MEAN 堆栈的新手,正在尝试使用教程的基本应用程序。 使用 Angular 从注册表单获取用户输入。使用 bcrypt 加密密码。当我记录从注册表单发送的用户对象时,在前端该对象具有所有适当的数据。使用 $http.post() 方法发布。一旦后端控制器接收到对象,所有字段都会显示 'undefined'.

我看到之前有几个人讨论过同样的错误,每个人得出的唯一结论是 bcrypt.hashSync() 函数没有收到密码或收到未定义的密码。如何解决函数接收为 "undefined" 的问题?请帮忙。

后端 app.js 文件 -

require('./api/data/db.js');
var express = require('express');
var app = express();
var path = require('path');
var bodyParser = require('body-parser');
var routes = require('./api/routes');

app.set('port',3000); //Defining port

app.use(function(req, res, next){
  console.log(req.method, req.url);
  next();
});

app.use(express.static(path.join(__dirname, 'public'))); // Delivering static files from public folder
app.use('/node_modules', express.static(__dirname+'/node_modules'));
app.use(bodyParser.urlencoded({ extended : false }));

app.use('/api',routes);

//Setting the port to listen to requests
var server = app.listen(app.get('port'), function(){
  var port = server.address().port; //Extract port number fromserver object
  console.log("App running. Port number - " + port);
});

注册控制器函数(node.js后端)-

module.exports.register = function(req, res){
console.log("Registering Users");
console.log(req.body.email);
console.log(req.body.fname);
console.log(req.body.lname);
console.log(req.body.password);
var email = req.body.email;
var fname = req.body.fname;
var lname = req.body.lname;
var password = req.body.password;

User.create(
  {
    email: email,
    fname: fname,
    lname: lname,
    password: bcrypt.hashSync(password, bcrypt.genSaltSync(10))
  }, function(err, user){
    if(err){
      console.log(err);
      res
        .status(400)
        .json(err);
    } else {
      console.log("User created", user);
      res
        .status(201)
        .json(user);
    }
  }
);
};

注册控制器函数(angular.js前端)-

function RegisterController($http){
var vm = this;

vm.register = function(){
var user = {
  email: vm.email,
  fname: vm.fname,
  lname: vm.lname,
  password: vm.password
};

if(!vm.email || !vm.password){
  vm.error = 'Please enter an email and password.';
} else {
  if(vm.password !== vm.passwordRepeat){
    vm.error = 'Please enter matching passwords.';
  } else {
    console.log(user);
    $http.post('/api/users/register', user).then(function(result){
      console.log(result);
      console.log(user);
      vm.message = 'Successful registration! Please login.';
      vm.error= '';
    }).catch(function(error){
      console.log(error);
    });
  }
}
}
};

带路由的节点文件 -

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


var ctrlUsers = require('../controllers/users.controller.js');

router
  .route('/users/register')
  .post(ctrlUsers.register);

module.exports = router;

HTML -

<h1>Register</h1>

<div ng-if="vm.message" class="alert alert-success" role="alert">
  <p>{{ vm.message }}</p>
</div>

<div ng-if="vm.error" class="alert alert-danger" role="alert">
  <p>{{ vm.error }}</p>
</div>

<form ng-hide="vm.message" name="register" ng-submit="vm.register()">
  <div class="form-group">
    <label for="email">Email</label>
    <input type="email" class="form-control" id="email" placeholder="Enter Email" ng-model="vm.email" autocapitalize="none">
  </div>

  <div class="form-group">
    <label for="password">Password</label>
    <input type="password" class="form-control" id="password" placeholder="Enter password" ng-model="vm.password" autocapitalize="none">
  </div>

...some more elements...

<button type="submit" class="btn btn-success">Register</button>

</form>

控制台:

GET /angular-app/app.js
GET /angular-app/register/register-controller.js
GET /angular-app/register/register.html
POST /api/users/register
Registering Users
undefined
undefined
undefined
undefined
Error: data and salt arguments required

你能试试下面的代码吗?我没有尝试过 运行 这个,但希望它能提供一个想法。也可以尝试在 html

中使用 ng-click
function RegisterController($http, $scope){
    $scope.vm = {};

    $scope.register = function() {
       var user = {
      email: $scope.vm.email,
      fname: $scope.vm.fname,
      lname: $scope.vm.lname,
      password: $scope.vm.password
    };

    if(!$scope.vm.email || !$scope.vm.password){
      vm.error = 'Please enter an email and password.';
    } else {
      if($scope.vm.password !== $scope.vm.passwordRepeat){
        $scope.vm.error = 'Please enter matching passwords.';
      } else {
        console.log(user);
        $http.post('/api/users/register', user).then(function(result){
          console.log(result);
          console.log(user);
          $scope.vm.message = 'Successful registration! Please login.';
          $scope.vm.error= '';
        }).catch(function(error){
          console.log(error);
        });
      }
    }
    }
    };

问题是您的服务器接受这种格式的发布数据:

 username=jonas&password=test

但是 $.post 的默认设置发送为 json:

{ "username": "jonas", "password": "test" }

要解决此问题,请更改 $.post 发送的数据,或者将服务器 bodyparser 从 urlencoded 更改为 json:

app.use(bodyParser.json());

how [did] you realized that would work?

当您在客户端记录 user 对象时,我假设您已检查数据是否已正确发送,并且您的路由似乎是正确的。所以错误必须在 $.post 调用和到达路由的数据之间的某个地方。当您正确安装路由时,剩下的唯一错误是正文编码不匹配。