【问题标题】:How to Get Params from Http Post and Insert如何从 Http Post 和 Insert 中获取参数
【发布时间】:2016-10-09 10:00:26
【问题描述】:

我正在尝试捕获用户输入的凭据并将它们用作查询数据库的参数。不幸的是,我对如何编写该过程有点迷茫。我正在使用 angular、express、node、jQuery 和 html。我对 angular、node 和 jQuery 不是很有经验,所以如果这很简单,请原谅我;我是来学习的。

这是表单所在的 html:

<!DOCTYPE html > 
<html ng-app="token">
<%include header%>
<%include navbar%>
<div ng-controller="TokenCtrl">
<form ng-submit="submitLogin(loginForm)" role="form" ng-init="loginForm = {}">
<div class="form-group">
<label>email</label>
<input type="email" name="email" ng-model="loginForm.email" required="required" class="form-control"/>
</div>
<div class="form-group">
<label>password</label>
<input type="password" name="password" ng-model="loginForm.password" required="required" class="form-control"/>
</div>
<button class="btn btn-primary btn-lg" ng-click="handleLoginBtnClick()">Sign in</button>
</form>
</div>
</body>

这里是 TokenCtrl 和 token 模块的 JS,它是 ng-token-auth 的派生词:

 var a = angular.module('token', ['ng-token-auth']);
 a.config(function($authProvider) {
// the following shows the default values. values passed to this method
// will extend the defaults using angular.extend

$authProvider.configure({
  apiUrl:                  '/users',
  tokenValidationPath:     '/auth/validate_token',
  signOutUrl:              '/auth/sign_out',
  emailRegistrationPath:   '/auth',
  accountUpdatePath:       '/auth',
  accountDeletePath:       '/auth',
  confirmationSuccessUrl:  window.location.href,
  passwordResetPath:       '/auth/password',
  passwordUpdatePath:      '/auth/password',
  passwordResetSuccessUrl: window.location.href,
  emailSignInPath:         '/auth/sign_in/:email/:password',
  storage:                 'cookies',
  forceValidateToken:      false,
  validateOnPageLoad:      true,
  proxyIf:                 function() { return false; },
  proxyUrl:                '/proxy',
  omniauthWindowType:      'sameWindow',
  tokenFormat: {
    "access-token": "{{ token }}",
    "token-type":   "Bearer",
    "client":       "{{ clientId }}",
    "expiry":       "{{ expiry }}",
    "uid":          "{{ uid }}"
  },
  cookieOps: {
    path: "/",
    expires: 9999,
    expirationUnit: 'days',
    secure: false,
    domain: 'domain.com'
  },
  createPopup: function(url) {
    return window.open(url, '_blank', 'closebuttoncaption=Cancel');
  },
  parseExpiry: function(headers) {
    // convert from UTC ruby (seconds) to UTC js (milliseconds)
    return (parseInt(headers['expiry']) * 1000) || null;
  },
  handleLoginResponse: function(response) {
    return response.data;
  },
  handleAccountUpdateResponse: function(response) {
    return response.data;
  },
  handleTokenValidationResponse: function(response) {
    return response.data;
  }
});
 });
  a.controller('TokenCtrl', function($scope, $auth) { 
  $scope.handleRegBtnClick = function() {
  $auth.submitRegistration($scope.registrationForm)
    .then(function(resp) {
      // handle success response
    })
    .catch(function(resp) {
      // handle error response
    });
};
 $scope.handlePwdResetBtnClick = function() {
  $auth.requestPasswordReset($scope.pwdResetForm)
    .then(function(resp) {
      // handle success response
    })
    .catch(function(resp) {
      // handle error response
    });
};
 $scope.handleLoginBtnClick = function() {
  $auth.submitLogin($scope.loginForm)
    .then(function(resp) {
      // handle success response
    })
    .catch(function(resp) {
      // handle error response
    });
};
$scope.handleSignOutBtnClick = function() {
  $auth.signOut()
    .then(function(resp) {
      // handle success response
    })
    .catch(function(resp) {
      // handle error response
    });
};
});

在运行这个函数时,它会指向这个url:

'/auth/sign_in/:email/:password'

使用 Express,我将此 url 路由到另一个函数。这是路线代码:

app.post('/users/auth/sign_in/:email/:password', routes.verifyusers);

导致,

exports.verifyusers= function(req, res) {
models.user.find({
where: {
  email: req.params.email,
  password: req.params.password
}
 }).then(function(user) {
    if(user) {
        console.log("alright !")
    };
});
};

当代码运行时,这是我在控制台中得到的:

Executing (default): SELECT "id", "username", "email", "password",    "createdAt", "updatedAt" FROM "users" AS "user" WHERE "user"."email" =   ':email' AND "user"."password" = ':password' LIMIT 1;
:email
:password

这是结果与表单数据无关。

【问题讨论】:

  • 您发布的代码有什么问题?我不确定您的问题是什么...作为旁注,您应该在将密码发送到数据库之前对其进行哈希处理。
  • 请看更新,抱歉。当我运行代码时,我没有捕获和插入表单数据——我只得到基于 url 的结果,即 :email 和 :password
  • 我不知道想要 $auth.submitLogin 正在做什么,但它似乎像“/users/auth/sign_in/:email/:password”一样调用网址
  • 是的,没错。我不知道如何将表单数据作为参数插入 url,就像这样。
  • sorry 上一条消息跑的很快,我想问一下 $auth.submitLogin 是干什么的?你也检查过“req.query”吗?

标签: javascript jquery angularjs node.js


【解决方案1】:

我认为问题出在emailSignInPath: '/auth/sign_in/:email/:password',

你应该试试

// config
emailSignInPath: '/auth/sign_in'

// route declaration
app.post('/users/auth/sign_in', routes.verifyusers);

// route action
exports.verifyusers = function(req, res) {
  models.user.find({
    where: {
      email: req.body.email,
      password: req.body.password
    }
  }).then(function(user) {
    if(user) {
      console.log("alright !")
    };
  });
};

ps:别忘了在你的应用中声明一个body parser app.use(express.bodyParser())

【讨论】:

  • 这样的结果是:Executing (default): SELECT "id", "username", "email", "password", "createdAt", "updatedAt" FROM "users" AS "user" WHERE "user"."email" = NULL AND "user"."password" = NULL LIMIT 1;
  • 我编辑提到 bodyparser 你有没有中间件?
  • 是的,我做到了。虽然,我认为这里的问题是没有参数数据,我们需要从表单中获取。
  • 您应该在浏览器的网络选项卡中检查凭据是否发送,以及如何发送(正文、查询字符串、路径?)
  • 是的,它们是 JSON 中的参数。但是,我不知道如何抓住并使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多