有时数据未在浏览器中显示

时间:2016-05-18 17:59:34

标签: javascript node.js mongodb express mongoose

当我点击ctr + r时,有时整个数据都没有显示出来。在我的("/")页面上,我有左侧和右侧。左侧应显示所有数据,右侧应显示随机数据。它大部分时间都有效但如果我点击键盘上的ctr + r进行刷新,有时会出现部分或全部数据。

这就是我的代码的工作原理。

  • comps个集合设置为来自arr的数据(现在我有3个元素.3个文档)。
  • 实际上在它之前删除了集合中的所有内容,所以每次我去“/”我只得到3个文档(用于测试)
  • 找到包含过滤器的所有文档并在左侧显示它们(我可以显示它们,因为find方法返回doc)然后我在渲染中使用doc。
  • 使用findOne()获取随机数。

另外你应该注意我的代码中确实有console.log(),它可以控制正确的信息。我在控制台中获取了所有3个文档。

老实说,我在渲染时从未在模型上使用过多个方法,而且我从未在模型方法中使用过随机方法。所以我可能搞砸了。

我想知道为什么有时候刷新时数据不会出现。

server.js

var express = require("express"),
    app = express(),
    mongoose = require("mongoose"),
    ejs    = require("ejs");
mongoose.connect("mongodb://localhost/comp1");
var port = process.env.PORT || 3000;   
app.set("view engine", "ejs"); 
app.use(express.static("./public"));

var Comp = require("./models/company.js");

app.get("/", function(req, res){
    var arr = [
    {name : "comp1",industry : "industry1", ranking: 20},
    {name : "comp2",industry : "industry2", ranking: 5},
    {name : "comp3",industry : "industry3", ranking: 10}
    ]
 Comp.count({}, function(err, count){
       var random = Math.floor(Math.random() * count);
        Comp.find({}).remove({}, function(){
            console.log("removed")
        })
        Comp.create(arr, function(err, docs){
            console.log(docs)
            console.log(count)
        })

       Comp.find({}, 'name -_id ranking', {sort :{ranking :1}}, function(err, doc){
            if(err) throw err;
            Comp.findOne().skip(random).exec(function(err, result){
                res.render("index",{data : doc , count: random , result : result})
            })

        })
   })

})




app.listen(port, function(){
    console.log("node is listening on port : " + port );
})

index.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
    <link rel="stylesheet" href="/style.css">
</head>
<body>
    ontop
    <div class="container clearfix">
        <div class="leftSide">TEST
            <%= data%>
            <%data.forEach(function(comp){%>
                <div><%= comp.name %> <span>ranking : <%= comp.ranking %></span></div>
            <%  }); %>
        </div>
        <div class="rightSide">side <%= count %>
            <div><%=result %></div>
        </div>
    </div>

</body>
</html>

company.ejs

var mongoose = require("mongoose");
var Schema = mongoose.Schema;

var compSchema = new Schema({
    name : String,
    industry: String,
    ranking : Number,
    created_at : Date,
    updated_at : Date,
    inc : Number

});

compSchema.pre("save", function(next){
    var currentDate = new Date();
    this.updated_at = currentDate;
    var counter = 0;
    this.inc = counter;
    counter++;

    if(!this.created_at){
        this.created_at = currentDate;
    }
    next();
})

var Comp = mongoose.model("Comp", compSchema);

module.exports = Comp;

1 个答案:

答案 0 :(得分:1)

最简单但 NOT RECOMMENDED 做你想做的事的方法是下面的代码,但它通常导致回调地狱厄运金字塔并且难以阅读所以不要使用此 !!!!

Comp.count({}, function(err, count){
   Comp.find({}).remove({}, function(){
      Comp.create(arr, function(err, docs){
         Comp.find({}, ..., function(err, doc){                
            Comp.findOne().skip(random).exec(function(err, result){
                res.render("index",{})
            })    
         }) 
      })
   })    
})

另一种方法是使用 async.js

async.series([
    function(callback){
        Comp.count({}, function(err, count){
            callback(null, count);
        });
    },
    function(callback){
        Comp.find({}).remove({}, function(){
            callback(null);
        });
    },
    function(callback){
        Comp.create(arr, function(err, docs){
            callback(null);
        });
    },
    function(callback){
        Comp.find({}, ..., function(err, doc){ 
            callback(null);
        });
    },
    function(callback){
        Comp.findOne().skip(random).exec(function(err, lastResult){
            callback(null, lastResult);
        });
    }
],
// optional callback, results is an array of results from each callback if any
function(err, results){
    // results is now equal to [count, lastResult]
    res.render("index",{})
});

最后Promises 我没有尝试或使用过这个,所以不是100%肯定但是这样的事情

var promise = Comp.count({}).exec();

promise.then(function(count) {
    return Comp.find({}).remove({}).exec();
})
.then(function() {
    return Comp.create(arr, ).remove({}).exec();
})
.then(function() {
    return Comp.find({}).remove({}).exec();
})
.then(function() {
    return Comp.find({}).skip(random).exec();
})
.then(function(result) {
    res.render("index",{})
})

在这里查看有关mongoose How to use mongoose Promise - mongo

上的承诺的更多详细信息