Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose自定义模式类型toJSON/Transform_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Node.js Mongoose自定义模式类型toJSON/Transform

Node.js Mongoose自定义模式类型toJSON/Transform,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,对于我目前正在开发的应用程序,我需要存储没有时间的日期。为此,我创建了一个自定义模式类型,如下所示: var mongoose = require('mongoose'); /** * Registers a new DateOnly type field. Extends the `Date` Schema Type */ function DateOnly(key, options) { mongoose.SchemaTypes.Date.call(this, key, optio

对于我目前正在开发的应用程序,我需要存储没有时间的日期。为此,我创建了一个自定义模式类型,如下所示:

var mongoose = require('mongoose');

/**
 * Registers a new DateOnly type field. Extends the `Date` Schema Type
 */
function DateOnly(key, options) {
  mongoose.SchemaTypes.Date.call(this, key, options, 'DateOnly');
}

DateOnly.prototype = Object.create(mongoose.SchemaTypes.Date.prototype);

DateOnly.prototype.cast = (originalValue) => {
  try {
    var value = originalValue;
    if (typeof value === 'string' && !value.match(/^([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))(T00:00:00.000Z)?$/)) {
      throw new Error('Date is invalid');
    } else if (typeof value === 'number') {
      value = new Date(value);
    }

    if (value instanceof Date) {
      value = new Date(value.getFullYear(), value.getMonth(), value.getDate());
    }

    return mongoose.Schema.Types.Date._cast(value);
  } catch (err) {
    throw new mongoose.SchemaType.CastError('date', originalValue, this.path);
  }
};

mongoose.Schema.Types.DateOnly = DateOnly;

module.exports = DateOnly;
允许模型接受日期字符串(例如:
2020-01-01
)和日期对象。现在,这将在UTC时间午夜存储所有日期,这样我仍然可以获得在mongodb中存储为日期的所有优势

我的问题在于,当我将其中一个日期返回到API时,它将以完整的ISO格式返回(例如:
2020-01-01T00:00:00.000Z
),该格式将转换为本地用户的时区。在我的时区中,此日期将显示为比预期提前1天

所以我的问题是,我如何使它在调用
document.toJSON
时转换日期?我知道我想要返回的是
date.toISOString().substring(0,10)

我尝试从Date类继承,但发现它与mongoose和mongodb驱动程序的工作方式不兼容


我知道我可以编写一个方法来放入
toJSON.transform
选项,但是我必须对使用该类型的每个字段和模型都这样做。

在mongoose
5.9.0
中添加了一个解决方案,可以这样做:

DateOnly.set('transform', (val) => {
  return /* transformed value */;
});


来源:

您是否考虑过使用力矩?var Moment=require(“力矩”);矩().format();然后你可以用…作为例子。。。。矩()格式('YYYY-MM-DD');我不认为这与我的问题有什么关系。我如何安排日期没有关系,这不是问题所在。