SailsCasts 用户模型验证

SailsCasts User model validation

我正在按照 Ponzi Coder 的 SailsCasts Youtube 视图创建注册表单,但我在用户模型验证方面遇到问题。如果我取出验证规则,我可以提交表单,但是当我把规则放回去时,我会收到下面的警告。另外,当我能够提交它时,只返回 ID 和 CreatedAt,没有别的:

{
  "error": "E_VALIDATION",
  "status": 400,
  "summary": "3 attributes are invalid",
  "model": "User",
  "invalidAttributes": {
    "name": [
      {
        "rule": "string",
        "message": "`undefined` should be a string (instead of \"null\", which is a object)"
      },
      {
        "rule": "required",
        "message": "\"required\" validation rule failed for input: null"
      }
    ],
    "email": [
      {
        "rule": "string",
        "message": "`undefined` should be a string (instead of \"null\", which is a object)"
      },
      {
        "rule": "email",
        "message": "\"email\" validation rule failed for input: null"
      },
      {
        "rule": "required",
        "message": "\"required\" validation rule failed for input: null"
      }
    ],
    "password": [
      {
        "rule": "string",
        "message": "`undefined` should be a string (instead of \"null\", which is a object)"
      },
      {
        "rule": "required",
        "message": "\"required\" validation rule failed for input: null"
      }
    ]
  }
}

下面是我的用户模型:

module.exports = {
 
schema: true,
 
  attributes: {
  name: {
 type: 'string',
 required: true
   },
  
  email: {
   type: 'string',
   email: true,
   unique: true,
   required: true
  },
  password: {
   type: 'string',
   required: true
  },
  encryptedPassword:{
   type: 'string'
  },
 
}
};

下面是我的用户控制器:

module.exports = {
 // Gets the view: signup.ejs
 'signup': function(req, res){
  res.view();
 },
 
 //Creates a user with the info sent from the 
 //signup form in signup.ejs
 create: function(req, res, next){
 User.create (req.params.all(), function userCreated(err, user){
  //If there is an error
  if(err) return next(err);
  
  //After the user is successfully created
  //redirect user to the show action
  res.json(user);
 }); 
 }
};

下面是我的注册表单:

<form action="/user/create" method="POST" class="form-horizontal">
  <div class="control-group">
 <label class="control-label" for="inputname">Name</label>
    <div class="controls">
      <input type="text" id="Name" placeholder="Name">
    </div>
  </div>
  
  <div class="control-group">
 <label class="control-label" for="inputEmail">Email</label>
    <div class="controls">
      <input type="text" id="Email" placeholder="Email">
    </div>
  </div>
  <div class="control-group">
    <label class="control-label" for="inputPassword">Password</label>
    <div class="controls">
      <input type="password" id="Password" placeholder="Password">
    </div>
  </div>
  
  <div class="control-group">
    <label class="control-label" for="inputRetypePassword">Retype Password</label>
    <div class="controls">
      <input type="password" id="RetypePassword" placeholder="Retype Password">
    </div>
  </div>
  <div class="control-group">
    
      <button type="submit" class="btn">Sign up</button>
    
  </div>
  <input type="hidden" name="_csrf" value="<%= _csrf %>"/>
</form>

您需要在输入中添加 "name" 属性:

<input type="text" id="Name" placeholder="Name">

变成

<input type="text" id="Name" name="name" placeholder="Name">

您的所有输入都相同。不要忘记像您的模型一样将 "name" 小写。

我能够解决我的问题。我修改了 http.js 中的中间件。在我的例子中,bodyParser 中间件在订单中丢失了。当我将护照与 sailsjs 集成时,我可能已经这样做了。一旦我添加回 'bodyParser',我的 post 请求开始获得预期的参数。

希望这对某人有所帮助。

in config/http.js

order: [
  'startRequestTimer',
  'cookieParser',
  'session',
  'bodyParser',
  'passportInit',
  'passportSession',
  '$custom',
  'router',
  'www',
  'favicon',
  '404',
  '500'
]