问题描述
nodejs中使用mongoose连接mongodb,如何在static方法中自动添加时间?下面代码添加的时间一直是代码刚开始运行的时间。
import * as mongoose from ’mongoose’;const Schema = mongoose.Schema;const ContentSchema = new Schema({ content: { type: String }, status: { type: Number }, crawlAt: { type: Date }}, { _id: false });ContentSchema.statics.uniSave = async (doc,cb) => {try{ doc.crawlAt = doc.crawlAt ? doc.crawlAt : new Date; console.log(doc); await doc.save();}catch(error){ cb(error);}}const Crawl = mongoose.model(’Crawl’, ContentSchema,’crawl’);let document = new Crawl({content:'This is example',status: 404})// 直接插入Crawl.uniSave(document, v => console.log(v))setTimeout(async function () { // 延迟插入 await Crawl.uniSave(document, v => console.log(v))}, 1000 * 10);
打印信息
// 直接插入{ crawlAt: 2017-03-27T04:58:53.992Z, content: ’This is example’, status: 404 }// 延迟插入{ crawlAt: 2017-03-27T04:58:53.992Z, content: ’This is example’, status: 404 }
我想要的效果是延迟插入时间大于直接插入时间(例子是在10秒后),实际跑出来的两个时间是相等的。是因为setTimeout()方法的问题吗?
解决:我的问题是每次测试保存其实用的同一个文档,所以时间一直相同。schema.static(’method’, cb)和schema.static.method = cb等价。
问题解答
回答1:假如是自动添加时间,为什么不用:
crawlAt: { type: Date, default: Date.now }
依据您的想法,写了一个statics(使用到async/await)的使用栗子。请主要参考语法,希望有用:
ContentSchema.statics.uniSave = async (doc,cb) => { try{ doc.crawlAt = doc.crawlAt ? doc.crawlAt : new Date; console.log(doc); await doc.save(); }catch(error){ cb(error); }}const Crawl = mongoose.model(’Crawl’, ContentSchema,’crawl’);let document = new Crawl({content:'This is example',status: 404})Crawl.uniSave(document, v => console.log(v))
供参考。
Love MongoDB! Have Fun!
回答2:想学习一下在static添加自定义时间,例如,更复杂的时间设置方式,楼上在schema中定义只能实现固定的时间点。