1

我正在用jade构建一个nodejs,express,mongodb博客。

我的文件夹结构是:project/modules/views/index.jade app.js articleprovider-memory.js articleprovider-mongodb.js

当我通过控制台运行 node app.js 并转到本地主机端口时,我得到了 TypeError:

无法在jade.debug.unshift.lineno 处读取未定义的属性“长度”...

在浏览器中。可能指的是匿名函数。

这是 Articleprovider-memory.js

ArticleProvider.prototype.save = function(articles, callback) {
  var article = null;

  if( typeof(articles.length)=="undefined")
    articles = [articles];

  for( var i =0;i< articles.length;i++ ) {
    article = articles[i];
    article._id = articleCounter++;
    article.created_at = new Date();

    this.dummyData[this.dummyData.length]= article;
  }
  callback(null, articles);
};

/* Lets bootstrap with dummy data */
new ArticleProvider().save([
  {title: 'Post one', body: 'Body one', comments:[{author:'Bob', comment:'I love it'}, {author:'Dave', comment:'This is rubbish!'}]},
  {title: 'Post two', body: 'Body two'},
  {title: 'Post three', body: 'Body three'}
], function(error, articles){});

exports.ArticleProvider = ArticleProvider;

articleprovider-mongodb.js

ArticleProvider = function(host, port) {
  this.db= new Db('node-mongo-blog', new Server(host, port, {auto_reconnect: true}, {}));
  this.db.open(function(){});
};

ArticleProvider.prototype.save = function(articles, callback) {
    this.getCollection(function(error, article_collection) {
      if( error ) callback(error)
      else {
        if( typeof(articles.length)=="undefined")
          articles = [articles];

        for( var i =0;i< articles.length;i++ ) {
          article = articles[i];
          article.created_at = new Date();
        }

        article_collection.insert(articles, function() {
          callback(null, articles);
        });
      }
    });
};

exports.ArticleProvider = ArticleProvider;

这是我的路线:

var articleProvider = new ArticleProvider('localhost', 27017);

app.get('/', function(req, res){    
    articleProvider.findAll( function(error,docs){        
        res.render('index.jade', {title: 'Blog', articles:docs});
            })
res.render('index.jade')
});

然后是 index.jade 文件

// extends layout

block content
h1= title
 #articles
    - each article in articles
      div.article
        div.created_at= article.created_at
        div.title 
            a(href="/blog/"+article._id.toHexString())!= article.title
        div.body= article.body

我已经阅读了很多关于所有依赖项的内容,但对它们仍然很陌生。据我所知,这些都可能是问题所在,如果我是对的,请告诉我详细的补救措施。

  1. 我的 index.jade 代码不正确

  2. index.jade 指的是一个数组,而我的文章对象不是一个数组

  3. mongodb 没有与应用程序建立正确的连接

  4. 我需要使用和尚,但我不是

我的一些代码来自这篇文章 http://howtonode.org/express-mongodb

先感谢您

4

1 回答 1

1

1.修复快递路线

您的路线有多个render呼叫。应该修改为。

app.get('/', function(req, res){    
    articleProvider.findAll( function(error,docs){        
        res.render('index.jade', {title: 'Blog', articles:docs});
    })
});

2.articles循环前在jade view中定义check

在遍历文章数组之前的玉视图中,确保它已经被定义。

block content
h1= title
 #articles
    - if(typeof(article) !== 'undefined')
       - each article in articles
         div.article
           div.created_at= article.created_at
           div.title 
               a(href="/blog/"+article._id.toHexString())!= article.title
           div.body= article.body

3.处理mongo查询中的error参数

您还考虑error了回调中可用的变量。因此,如果在查询 mongo 时发生任何错误,则可以处理。喜欢

app.get('/', function(req, res){    
    articleProvider.findAll( function(error,docs){  

        if(error) {
              console.log("mongo db error"+error);
              docs = [];
        }

        res.render('index.jade', {title: 'Blog', articles:docs});

    })
});
于 2013-11-09T13:47:30.010 回答