sails.js -postgresql为bigint字段返回字符串值而不是整数

时间:2015-10-03 08:05:11

标签: postgresql sails.js waterline sails-postgresql

我们正在使用Sails.js作为后端框架将项目从PHP迁移到Node.js。我们无法修改数据库,必须使用现有数据库进行此项目。

如果我为新创建的模型保留migrate: "alter",默认情况下Sails会将id字段保留为整数。

但是,对于我们现有的数据库,id字段大多为bigint。所以我定义了migrate: "safe"并继续进行模型创建。

现在我面临的问题是,当蓝图路由返回结果时,id列值应该作为字符串返回,而是作为字符串返回。这是一个例子:

[
  {
    "starttime": "07:00:00",
    "endtime": "14:00:00",
    "id": "1"
  },
  {
    "starttime": "14:00:00",
    "endtime": "22:00:00",
    "id": "2"
  },
  {
    "starttime": "22:00:00",
    "endtime": "07:00:00",
    "id": "3"
  }
]

如何解决此问题?

这是我的模特:

module.exports = {
  tableName: "timeslots",
  autoCreatedAt: false,
  autoUpdatedAt: false,
  attributes: {
    starttime: { type: "string", required: true },
    endtime: { type: "string", required: true }
  }
};

这是postgresql表定义

                                              Table "public.timeslots"
  Column   |  Type  |                       Modifiers                        | Storage  | Stats target | Description 
-----------+--------+--------------------------------------------------------+----------+--------------+-------------
 id        | bigint | not null default nextval('timeslots_id_seq'::regclass) | plain    |              | 
 starttime | text   | not null                                               | extended |              | 
 endtime   | text   | not null                                               | extended |              | 
Indexes:
    "idx_43504_primary" PRIMARY KEY, btree (id)
Referenced by:
    TABLE "doctortimeslot" CONSTRAINT "doctortimeslot_ibfk_2" FOREIGN KEY (timeslot_id) REFERENCES timeslots(id) ON UPDATE CASCADE ON DELETE CASCADE

2 个答案:

答案 0 :(得分:4)

Waterline对于它没有内置的数据类型变得奇怪。我认为当它不确定该怎么做时它会默认为字符串。这应该不重要,因为JS会自动将这些值强制转换为前端的数字。

但是,如果您需要它作为数字,最简单的解决方案可能是覆盖模型中的toJSON方法,并将其强制为整数。

module.exports = {
  tableName: "timeslots",
  autoCreatedAt: false,
  autoUpdatedAt: false,
  attributes: {
    starttime: { type: "string", required: true },
    endtime: { type: "string", required: true },

    toJSON: function(){
      var obj = this.toObject();
      obj.id = parseInt(obj.id);
      return obj;
    }

  }
};

答案 1 :(得分:0)

作为替代方案,您可以使用https://github.com/mirek/node-pg-safe-numbers通过委派不安全的处理(当数字不符合2 ^ 53 javascript限制时)来处理此问题 - 您可以在其中返回已解析的值,字符串,null ,抛出错误或做其他事情。

在许多情况下,您可以使用库提供的自动解析,并且在不安全的处理程序中只返回原始字符串值。然后在使用2 ^ 53以上数字的代码(即随机大数字)总是强制转换为字符串,你会没事的。