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
调用和到达路由的数据之间的某个地方。当您正确安装路由时,剩下的唯一错误是正文编码不匹配。
我是 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
调用和到达路由的数据之间的某个地方。当您正确安装路由时,剩下的唯一错误是正文编码不匹配。