NodeJs:数据转换器,如Laravel PHP Framework



我使用Laravel框架创建了多个REST API项目,并将我的代码结构基于Laracasts教程。但是,我们决定使用 NodeJs 作为后端移动一些项目。我开始学习节点,并尝试在 Node 中复制它。我能够为单个对象响应执行此操作,但对于多个对象,我似乎无法使其工作。

这是我的控制器:

index(req,res) {
    User
      .findAll()
      .then(function(users){
        res.json(api.respond(transfomer.transformCollection(users)));
      })
      .catch(function(error){
        res.json(api.respondWithError('users not found',error));
      });
  }

API 控制器:

模块导出 = {

  // response w/o error
  respond: function(data,msg,status) {
    if (msg == null) {
      return {
        'status': status || true,
        'data': data
      };
    } else {
      return {
        'status': true,
        'message': msg,
        'data': data
      };
    }
  },
  // response with error
  respondWithError: function(msg,error) {
    var self = this;
    var status = false;
    var data = {
      'error': error
    };
    return this.respond(data,msg,status);
  },
};

变压器.js

module.exports = {
  // single transformation
  transform (user) {
    return {
      'id' : user.id,
      'username': user.username,
      'firstname': user.firstname,
      'lastname': user.lastname,
      'address': user.address,
      'phone': user.phone,
      'mobile': user.mobile,
      'status': user.status
    };
  },
  //
  transformCollection(users) {
    var self = this;
    var data = [];
    for (var i = 0; i <= users.length; i++) {
        data.push(this.transform(users[i]));
    }
    return data;
  }
};

示例输出

{
  "status": true,
  "data": [ 
    {
        "id": 1,
        "username": "b@email.com",
        "firstname": "Jon",
        "lastname": "Doe",
        "address": "Homes",
        "phone": "+966501212121",
        "mobile": "+966501212121",
        "status": "NOT VERIFIED"
    },
    {
        "id": 1,
        "username": "b@email.com",
        "firstname": "Jon",
        "lastname": "Doe",
        "address": "Homes",
        "phone": "+966501212121",
        "mobile": "+966501212121",
        "status": "NOT VERIFIED"
    },
    {
        "id": 1,
        "username": "b@email.com",
        "firstname": "Jon",
        "lastname": "Doe",
        "address": "Homes",
        "phone": "+966501212121",
        "mobile": "+966501212121",
        "status": "NOT VERIFIED"
    },
    {
        "id": 1,
        "username": "b@email.com",
        "firstname": "Jon",
        "lastname": "Doe",
        "address": "Homes",
        "phone": "+966501212121",
        "mobile": "+966501212121",
        "status": "NOT VERIFIED"
    },
  ]
}

很抱歉问这个问题,因为我对节点有点陌生。是否有可能实现该输出,因为我尝试了不同的方式,但我仍然收到错误。顺便说一句,我正在为数据库使用续集。

谢谢。

你可以使用这个:

const options = {
    raw: true, 
    attributes: ['id', 'name', 'code', 'createdAt','updatedAt']
};
country.findAndCountAll(options).then(querySnapshot => {
    const total = querySnapshot.count;
    resolve({
        docs: querySnapshot.rows, 
        total: total
    })  
}).catch((err) => {
    reject(err)
});

我已经找到了问题的答案,因为 sequelize 将结果作为对象返回,除了数据库结果之外,我还具有其他属性,我不得不修改控制器以设置结果并将其转换为原始结果,以便我从数据库中的查询结果中获取对象数组。

index(req,res) {
    User
      .findAll({ raw: true }) // added "raw: true"
      .then(function(users){
        res.json(api.respond(transfomer.transformCollection(users)));
      })
      .catch(function(error){
        res.json(api.respondWithError('users not found',error));
      });
  },

这将从数据库中返回对象数组,并且数据转换器从那里正常工作。谢谢你的帮助。

最新更新