javascript express.js中的spread运算符表单提交

cbeh67ev  于 2022-10-30  发布在  Java
关注(0)|答案(3)|浏览(130)

spread操作符可以解决下面的问题吗?假设我有更多的字段,那么我必须为每个字段声明req.body.something,这是非常乏味的。

app.use((res,req,next) => {
  const obj = {
     name: req.body.name,
     age: req.body.age,
     gender: req.body.gender
  }
  //
  User.saveUser(resp => res.json(resp)) //User model
})
zpgglvta

zpgglvta1#

您可以使用lodash的pick()

_.pick(对象,[路径])

创建由拾取的对象特性组成的对象。
示例代码为:

const _ = require('lodash');
...
const obj = _.pick(req.body, ['name', 'age', 'gender']);

如果gender不存在于req.body中,它将被忽略--结果obj对象将没有gender字段。
如果需要所有的req.body字段,则只需将req.body赋值给obj

const obj = req.body;

要验证req.body内容,可以使用lodash的.has()

_.has(对象,路径)

检查路径是否为对象的直接属性。
示例代码为:

_.has(req.body, ['name', 'age', 'gender']); // return true if all fields exist.
3ks5zfa0

3ks5zfa02#

您可以使用destructuring assignment

const obj = req.body;
const { name, age, gender } = obj;

但是,您仍然必须验证它,并将它们全部计入您的方案中。

更新日期:

添加一些验证示例。
假设路由中存在这样的架构:

const tv4 = require('tv4');

const schema = {
  type: 'object',
  properties: {
    name: 'string',
    age: number,
    gender: {
      type: 'string',
      pattern: /f|m/i
    }
  },
  required: ['name']
};

然后,在处理程序中验证:

if (tv4.validate(req.body, schema) {
 // continue your logic here
} else {
 // return 400 status here
}
nhn9ugyo

nhn9ugyo3#

你可以使用反结构赋值

const { name, age, gender } = req.body

或者,如果您希望使用扩展操作,则可以用途:

const obj = { ...req.body }

希望能有所帮助!

相关问题