【发布时间】:2018-10-18 06:23:13
【问题描述】:
我正在使用 mongoose 和以下 ConfigItem 架构:
var ConfigItem = new Schema({
name: {
type: String,
required: true
},
value: {
type: String,
required: false
},
date: {
type: Date,
required: false
},
user: {
type: String,
required: false
}
});
接下来,我有一个根据这个架构保存文档的功能:
function createConfigItem(_name, _value, _date, _user, callback) {
var config = new ConfigItems({
name: _name,
value: _value,
date: _date,
user: _user
});
config.save(function handleSaveConfig(err) {
if(callback){
callback(err);
}
});
}
接下来,我有一个单元测试(基于 mocha),它以下列方式使用该函数:
createConfigItem('sftpHost', '1.1.1.1', '2018-03-15 10:06:40.713', 'user1', callback);
如果我在 mocha 下运行测试(见注 1),我会在 MongoDB 上得到以下结果:
> db.configitems.find()
{ "_id" : ObjectId("5af173b1f155a4bff29f3e35"), "name" : "sftpHost", "value" : "1.1.1.1", "date" : ISODate("2018-03-15T10:06:40.713Z"), "user" : "user1", "__v" : 0 }
这是我所期望的。
但是,如果我通过 grunt 使用istanbul 运行(请参阅注 2)以获取覆盖率报告,则对 createConfigItem() 的相同调用会在 DB 中创建以下文档:
> db.configitems.find()
{ "_id" : ObjectId("5af176cbcffb8cc20a1fe3c2"), "name" : "sftpHost", "value" : "1.1.1.1", "date" : ISODate("2018-03-15T09:06:40.713Z"), "user" : "user1", "__v" : 0 }
请注意,在这种情况下,DB 中的 date 字段相对于 _date 字符串参数偏移一小时。
我认为它可能与时区有某种关联,但我已确保我的进程在 UTC 设置 process.env.TZ = 'UTC' 下运行。
我有点迷失了......关于日期和/或时区的猫鼬/咕噜声/伊斯坦布尔是否有任何已知问题?请问有关于这个问题的提示吗?
注1:使用的命令:
/home/fermin/.nvm/versions/node/v6.12.3/bin/node --debug-brk=50806 --expose_debug_as=v8debug /home/fermin/src/ctxmboard/node_modules/mocha/bin/_mocha --timeout 0 --ui bdd --reporter /home/fermin/.PyCharm2018.1/config/plugins/NodeJS/js/mocha-intellij/lib/mochaIntellijReporter.js --recursive /home/fermin/src/ctxmboard/test/back/unit
注2:使用的命令:
/home/fermin/.nvm/versions/node/v6.12.3/bin/node --debug-brk=33002 --expose_debug_as=v8debug ./node_modules/.bin/istanbul cover --root lib/ --dir site/coverage -- /home/fermin/.nvm/versions/node/v6.12.3/lib/node_modules/grunt-cli/bin/grunt test
【问题讨论】:
-
从逻辑上讲,我认为解决这个问题的方法是以有效的 ISO 格式为 UTC
'2018-03-15T10:06:40.713Z'提供“字符串”。它可能使用 momentjs 来解析,但回退应该始终是纯 JavaScriptDate(),这当然会对 ISO 字符串感到满意。不要留下任何误解的余地,应该没问题。 -
解决了这个问题。谢谢! :)
标签: node.js mongoose gruntjs istanbul