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的方式取值?


6 回复

当然可以。你提出的问题主要集中在如何在 EJS 模板中正确地获取传递给视图的数据。EJS 是一个简单的模板引擎,它允许你在 HTML 文件中嵌入 JavaScript 代码。下面我会详细解释并提供示例代码。

问题解析

你提到的问题是为什么 article.contentarticle.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="">

关键点解释

  1. 数据传递

    • 在路由处理函数中,res.render('list', { articles: articles });articles 数组传递给 list.ejs 视图。
  2. 遍历数组

    • list.ejs 中,通过 articles.forEach 遍历传递过来的 articles 数组,并为每个元素渲染 partial/article.ejs
  3. 属性访问

    • partial/article.ejs 中,正确的属性访问方式是 article.contentarticle.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.contentarticle.author_thumb 来访问对象的属性,无需使用 article.get('content') 这种方式。EJS 直接支持这样的语法。

这样,你就可以正确地在 EJS 模板中获取传递的数据并显示出来。

回到顶部