Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 错误:需要数据和salt参数(节点未接收来自angular的用户输入对象?)_Javascript_Angularjs_Node.js_Mean Stack - Fatal编程技术网

Javascript 错误:需要数据和salt参数(节点未接收来自angular的用户输入对象?)

Javascript 错误:需要数据和salt参数(节点未接收来自angular的用户输入对象?),javascript,angularjs,node.js,mean-stack,Javascript,Angularjs,Node.js,Mean Stack,我对MEAN stack还不熟悉,尝试带教程的基本应用程序。 使用Angular从注册表获取用户输入。使用bcrypt对密码进行加密。当我记录从注册表发送的用户对象时,该对象在前端具有所有适当的数据。使用$http.post()方法进行过帐。在后端控制器中接收到对象后,所有字段都会显示“未定义” 我看到有几个人之前讨论过同样的错误,每个人得出的唯一结论是bcrypt.hashSync()函数没有收到密码,也没有收到未定义的密码。如何解决函数接收为“未定义”的问题?请帮忙 后端app.js文件-

我对MEAN stack还不熟悉,尝试带教程的基本应用程序。 使用Angular从注册表获取用户输入。使用bcrypt对密码进行加密。当我记录从注册表发送的用户对象时,该对象在前端具有所有适当的数据。使用$http.post()方法进行过帐。在后端控制器中接收到对象后,所有字段都会显示“未定义”

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

后端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后端)-

寄存器控制器功能(angular.js前端)——

具有路由的节点文件-

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>

你能试试下面的代码吗。我还没有试过运行这个,但希望它能提供一个想法。还可以尝试在html中使用
ng单击

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());
你是如何意识到这会起作用的


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

如何将注册函数安装到路由?@vizsatiz我意识到这几乎是同一个问题,但我没有找到解决方案,以“未定义”的形式接收密码。@JonasW。角度部分还是节点部分?节点部分…router.route('/users/register').post(ctrlUsers.register);控制台中出现错误-angular.js:13642 ReferenceError:$scope未定义angular.js:13642 ReferenceError:$scope未在新的RegisterController()中定义(
函数RegisterController($http,$scope)
这就是您定义的方式吗?我很糟糕,我忘记了那行中的$scope。因此,错误现在不再出现,但在按下submit按钮后,什么也没有发生。该按钮几乎没有添加任何功能。您是否使用了按钮上的
ng单击
?谢谢!这是有道理的。
 username=jonas&password=test
{ "username": "jonas", "password": "test" }
app.use(bodyParser.json());