返回物体出现在前端但不会推到后端

时间:2017-05-18 20:34:09

标签: angularjs node.js

好吧,我觉得自己像个白痴,因为我已经做了一千次......但我已经和他争斗了一个多小时,准备去吃午饭。我希望有人能在我回来的时候回答:)我需要将密码输入与我在数据库中存储的内容进行比较。当我记录我在服务中发送到后端的对象时,它会完美显示,但是当我尝试将返回对象发送到后端时,我只是在登录时得到一个空对象" req.params&#34 ;.我也试过用" POST"而不是" GET"并记录" req.body"但这也是一个空物。有人可以告诉我,我做错了什么?我已经这么做了很多次,因为不得不提出这个问题而感到愚蠢,但我不能为我的生活弄明白这一点!提前致谢!这是我的代码

Controller (angular)
$scope.checkOldPassword = function(oldPassword) {
    var returnObj = {
        oldPassword: oldPassword
    }
    userSettingsService.checkPassword(returnObj).then(function(response){
        console.log(response);
    })
}

Service
this.checkPassword = function(oldPassword) {
    console.log(oldPassword);
    return $http({
        method: 'GET',
        url: '/api/checkOldPassword',
        params: oldPassword
    }).then(function(response) {
        return response.data;
    })
};

Server.js
app.get('/api/checkOldPassword', ensureAuthenticated, UserCtrl.checkOldPassword)

UserCtrl.js (node)
checkOldPassword: function(req, res, next) {
    console.log(req.params);

}

2 个答案:

答案 0 :(得分:1)

尝试从服务中搜索表单时添加标题

headers = { 'Content-Type': 'application/x-www-form-urlencoded' };
this.checkPassword = function(oldPassword) {
    console.log(oldPassword);
    return $http({
        method: 'GET',
        url: '/api/checkOldPassword',
        params: oldPassword,
        headers: headers
    }).then(function(response) {
        return response.data;
    })
};

答案 1 :(得分:0)

假设您正在使用Express,req.params是一个包含映射到命名路由“parameters”的属性的对象。例如,如果您有route / user /:name,那么“name”属性可用作req.params.name。 (参见http://expressjs.com/en/4x/api.html#req.params)在您的情况下,您没有调用这样的URL。

我相信你有(至少)两个选择:

选项1: 您可能需要更改$http来电,以取代' params'通过'数据' (我不知道Angular但this doc似乎提到.data而不是.params;无论如何,Express路线需要改变)

return $http({
    method: 'POST',
    url: '/api/checkOldPassword',
    data: {password: oldPassword}
}).then(function(response) {
    return response.data;
})

然后在req.body

中使用req.params代替UserCtrl.js
Server.js
app.post('/api/checkOldPassword', ensureAuthenticated, UserCtrl.checkOldPassword)

UserCtrl.js (node)
checkOldPassword: function(req, res, next) {
    console.log(req.body.password);
}

选项2: 你坚持req.params,然后调整你正在调用的URL(但密码将随URL一起发送,它不是很安全)

return $http({
    method: 'GET',
    url: '/api/checkOldPassword/'+oldPassword
}).then(function(response) {
    return response.data;
})

然后你的路线应该是

Server.js
app.get('/api/checkOldPassword/:password', ensureAuthenticated, UserCtrl.checkOldPassword)

UserCtrl.js (node)
checkOldPassword: function(req, res, next) {
    console.log(req.params.password);
}

PS:关于您的评论,无论您选择哪种方式,Angular $http来电和快捷路线app.xxx的方法都应匹配