当我点击ctr + r
时,有时整个数据都没有显示出来。在我的("/")
页面上,我有左侧和右侧。左侧应显示所有数据,右侧应显示随机数据。它大部分时间都有效但如果我点击键盘上的ctr + r
进行刷新,有时会出现部分或全部数据。
这就是我的代码的工作原理。
comps
个集合设置为来自arr
的数据(现在我有3个元素.3个文档)。另外你应该注意我的代码中确实有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;
答案 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
上的承诺的更多详细信息