我正在将此代码编写为客户的项目 当我去一个节目路线时,我得到了这500个内部服务器错误
http.get('/files/:id', function(req, res) {
var vid;
var pap;
Videos.find({}, function(err, videos) {
if (err) {
console.log(err);
} else {
vid = videos;
}
});
Papers.find({}, function(err, file) {
if (err) {
console.log(err);
} else {
pap = file;
}
});
Material.findById(req.params.id, function(err, found) {
if (err) {
console.log(err);
} else {
res.render('files', {
file: pap,
video: vid,
current: found
});
}
});
});
这是我的节目路线代码。
注意:如果我重新加载页面,则错误消失并且页面打开。
答案 0 :(得分:2)
原因是您需要等待所有数据库查询在渲染之前完成。在您的代码中,页面可以在其他两个查询完成之前呈现并返回其数据。好消息是Mongoose supports Promises用于异步函数。
http.get('/files/:id', function(req, res) {
Promise.all([
Videos.find({}).exec(),
Papers.find({}).exec(),
Material.findById(req.params.id).exec()
]).then( ([video, paper, material]) => {
res.render('files', {
file: paper,
video: video,
current: material
});
}).catch( error => console.log(error) );
});
答案 1 :(得分:1)
您与Mongoose一起使用的功能本质上是异步的;运行vid
时,不会初始化变量pap
和res.render
。当您尝试在前端使用这些变量时(模板如Jade,Handlebars EJS,我不知道您正在使用什么),它们是未定义的,并且随后导致500错误。您需要运行这些函数,以便res.render
运行时var async = require('async');
async.parallel([
// Each function in this array will execute in parallel
// The callback function is executed once all functions in the array complete
function (cb) {
Videos.find({}, function(err, videos) {
if (err) {
return cb(err);
} else {
return cb(null, videos);
}
});
},
function (cb) {
Papers.find({}, function(err, papers) {
if (err) {
return cb(err);
} else {
return cb(null, papers);
}
});
},
function (cb) {
Material.findById(req.params.id, function(err, found) {
if (err) {
return cb(err);
} else {
return cb(null, found);
}
});
}
], function (err, results) {
if (err) {
// If any function returns an error
// (first argument), it will be here
console.log(err);
}
else {
// Even though the functions complete asynchronously,
// the order in which they are declared in the array
// will correspond to the position in the array
// if it returns anything as a second argument.
var videos = results[0];
var files = results[1];
var found = results[2];
res.render('files', {
file: files,
video: videos,
current: found
});
}
});
可以使用所有Mongoose查询的结果;要么使用异步NodeJS库,要么在彼此内调用每个函数,然后在最后调用res.render。
async
Node module Videos.find({}, function(err, videos) {
var vid = videos;
if (err) {
console.log(err);
} else {
Papers.find({}, function(err, file) {
var pap = file;
if (err) {
console.log(err);
} else {
Material.findById(req.params.id, function(err, found) {
if (err) {
console.log(err);
} else {
res.render('files', {
file: pap,
video: vid,
current: found
});
}
});
}
});
}
});
int a[]