Nodejs ejs的view里面怎么取得值啊?(新手勿喷)
Nodejs ejs的view里面怎么取得值啊?(新手勿喷)
router.get("/list",******
Articles.find({}).limit(20).select(‘content author_thumb’).exec(function(err,articles){
return res.rend(‘list’,{ articles: articles});
}
…
//list.ejs
<% articles.forEach(function(article,index){ %>
<% include partial/article %>
<% }) %>
…
//partial/article.ejs
<h5><%= article.content %></h5>
<h4><%= article.get(‘content’) %></h3>
<img src="<%= article.get(‘author_thumb’)%>" alt=""
为什么不能用article.content的方式取值?
当然可以。你提出的问题主要集中在如何在 EJS 模板中正确地获取传递给视图的数据。EJS 是一个简单的模板引擎,它允许你在 HTML 文件中嵌入 JavaScript 代码。下面我会详细解释并提供示例代码。
问题解析
你提到的问题是为什么 article.content
和 article.get('content')
的使用结果不同。实际上,在 EJS 中,如果你直接访问对象的属性,应该使用点符号(.
)来访问属性,而不是使用 get()
方法。
示例代码
首先,我们来看一下服务器端的代码:
const express = require('express');
const router = express.Router();
const Articles = require('./models/Article'); // 假设你有一个 Articles 模型
router.get("/list", (req, res) => {
Articles.find({}, (err, articles) => {
if (err) {
console.error(err);
return res.status(500).send("Error fetching articles");
}
res.render('list', { articles: articles });
}).limit(20).select('content author_thumb');
});
module.exports = router;
接下来,我们看 EJS 模板文件 list.ejs
:
<% articles.forEach(function(article, index) { %>
<% include partial/article %>
<% }) %>
最后,partial/article.ejs
文件内容如下:
<h5><%= article.content %></h5>
<img src="<%= article.author_thumb %>" alt="">
关键点解释
-
数据传递:
- 在路由处理函数中,
res.render('list', { articles: articles });
将articles
数组传递给list.ejs
视图。
- 在路由处理函数中,
-
遍历数组:
- 在
list.ejs
中,通过articles.forEach
遍历传递过来的articles
数组,并为每个元素渲染partial/article.ejs
。
- 在
-
属性访问:
- 在
partial/article.ejs
中,正确的属性访问方式是article.content
和article.author_thumb
,而不是article.get('content')
或article.get('author_thumb')
。因为article
已经是一个 JavaScript 对象,你可以直接通过点符号访问其属性。
- 在
结论
确保在 EJS 模板中正确访问对象的属性。对于传递到模板的对象,直接使用 .
符号访问属性即可。如果使用 get()
方法,则需要确保该方法存在且返回预期的结果。希望这能帮助你解决你的问题!
楼主用的是Mongoose吧,Mongoose查询结果返回的是mongodocument,不是普通的Object,所以需要使用get方法获取值
好吧,找到为什么出错了,
//shema.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var articleSchema = new Schema({
author: { type: String, default: ‘’},
author_thumb: { type: String, default: ‘http://static.qiushibaike.com/images/thumb/missing.png’},
content: String,
att_img: {type:String, default: ‘’},
comment: { type: Number, default: 0},
up: { type: Number, default: 0},
created_at: { type: Date, default: Date.now()},
updated_at: { type: Date, default: Date.now()}
}, {collection : ‘articles’})
exports = module.exports = articleSchema;//注释之后只能.get()的方式取值了。
//model.js
var mongoose = require(‘mongoose’);
var schema = require(’…/schemas/article.js’);
var model = mongoose.model;
mongoose.connect(“mongodb://localhost/qiushibaike”)
var Article = mongoose.model(‘Article’,schema);
exports= module.exports = Article;
一不小心吧exports = module.exports = articleSchema 给注释了,注释之后只能.get的方式取值。取消注释之后就可以直接.title的方式取值了。至于为什么,请楼下高人回复!!
<% include partial/article %> 请问下你这里的partial文件夹跟当前模版目录在同一级吗?
partial目录是views目录下面的子目录啊。
在 EJS 模板引擎中,你可以直接通过 article.content
的方式来获取对象的属性。你代码中的问题在于在 partial/article.ejs
文件中,你在获取 content
属性时错误地使用了 article.get('content')
方法,而 EJS 模板引擎可以直接通过点符号来访问对象的属性。
以下是修正后的代码示例:
Express 路由处理部分
router.get("/list", (req, res) => {
Articles.find({})
.limit(20)
.select('content author_thumb')
.exec((err, articles) => {
if (err) return console.error(err);
res.render("list", { articles });
});
});
list.ejs
<% articles.forEach(function(article, index) { %>
<% include partial/article %>
<% }) %>
partial/article.ejs
<h5><%= article.content %></h5>
<h4><%= article.author_thumb %></h4>
<img src="<%= article.author_thumb %>" alt="">
解释
- 在路由处理部分,
res.render("list", { articles });
将articles
对象传递给视图模板。 - 在
list.ejs
中,<% articles.forEach(function(article, index) { %> ... <% }) %>
循环遍历每个article
对象,并包含partial/article.ejs
模板。 - 在
partial/article.ejs
中,你可以直接通过article.content
和article.author_thumb
来访问对象的属性,无需使用article.get('content')
这种方式。EJS 直接支持这样的语法。
这样,你就可以正确地在 EJS 模板中获取传递的数据并显示出来。