我使用mongoose.js将少量数据集保存到MongoDB。但是我在使用express.js和ejs在html网站上显示它们时遇到了问题。
以下是我的情景:
模型
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
var ItemSchema = new Schema({
_id: ObjectId,
creationTime: Date,
modificationTime: Date,
title: String
});
var Item = mongoose.model('item', ItemSchema);
module.exports.Item = Item;
路线:
app.get('/item/:id', function(req, res) {
Item.findById(req.params.id, function(err, doc){
console.log(doc); //This check displays everything correctly on console
res.render('item.html.ejs', {
item : doc
});
});
});
查看:
<h1><%= item.title %>:</h1>
<p>Creation: <%= item.creationDate %></p>
<p>Modification: <%= item.modificationDate %></p>
此设置的结果是标题正确显示,而两个日期均为undefined
。
我认为它与MongoDB的ISODate格式有关。但我无法找到如何转换它以便在html视图中显示的解决方案。
感谢您的帮助。干杯
答案 0 :(得分:9)
我在项目中使用了moment.js以下帮助者。
date: function(date){
moment(date).format('YYYY-MM-DD hh:mm:ss');
},
fromNow: function(date){
moment(date).fromNow()
}
答案 1 :(得分:1)
如果您只是复制并粘贴代码,解决方案非常简单。
在您的模型中,您在模板中定义了创建Time
和修改Time
,您尝试访问item.creation Date
和item.modification Date
。
在更改之后,您应该能够看到其他未定义的内容,但您可能仍需要将其转换为正确的日期格式。
答案 2 :(得分:1)
我使用上面的示例添加了一个ejs过滤器,但是我必须稍微更改它以使其工作:
在mongoose架构上创建'created_at'属性并在save()上自动创建它:
var ItemSchema = new Schema({
name : { type: String, required: true, trim: true }
, created_at : { type: Date }
});
ItemSchema.pre('save', function(next){
if ( !this.created_at ) {
this.created_at = new Date;
}
next();
});
安装时刻(并写入package.json)
npm install moment --save
在app.js或您为ejs定义过滤器的任何地方添加过滤器:
var moment = require('moment');
ejs.filters.fromNow = function(date){
return moment(date).fromNow()
}
使用page.ejs中的过滤器
<span class="created_at"><%=: item.created_at | fromNow %></span>