Javascript 我的nodejs代码中有错误
我将此代码作为一个客户项目来编写 当我去一个表演路线时,我得到了500个内部服务器错误Javascript 我的nodejs代码中有错误,javascript,node.js,express,Javascript,Node.js,Express,我将此代码作为一个客户项目来编写 当我去一个表演路线时,我得到了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;
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
});
}
});
});
这是我的表演路线代码
注意:如果我重新加载页面,错误将消失,页面将打开。您在Mongoose中使用的函数本质上是异步的;运行
res.render
时,变量vid
和pap
未初始化。当您尝试在前端中使用这些变量时(如Jade、Handlebars EJS等模板,我不知道您在使用什么),它们是未定义的,随后会导致500错误。您需要运行这些函数,以便所有Mongoose查询的结果在运行时可用于res.render
;使用异步NodeJS库,或者调用彼此之间的每个函数,然后在最后调用res.render
解决方案1:使用
解决方案2:嵌套回调
Mongoose使用的函数本质上是异步的;运行
res.render
时,变量vid
和pap
未初始化。当您尝试在前端中使用这些变量时(如Jade、Handlebars EJS等模板,我不知道您在使用什么),它们是未定义的,随后会导致500错误。您需要运行这些函数,以便所有Mongoose查询的结果在运行时可用于res.render
;使用异步NodeJS库,或者调用彼此之间的每个函数,然后在最后调用res.render
解决方案1:使用
解决方案2:嵌套回调
原因是您需要等待所有数据库查询完成后再进行渲染。在代码中,页面可以在其他两个查询完成并返回数据之前呈现。好消息是对于异步函数
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) );
});
原因是您需要等待所有数据库查询完成后再进行渲染。在代码中,页面可以在其他两个查询完成并返回数据之前呈现。好消息是对于异步函数
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) );
});
在这个世界上潜水是自然的错误。请记住:必须等待第三方响应的所有操作都是异步完成的。它可以是db查询请求、一些api请求、监视事件的东西等等(当我将变量从本地更改为全局时,它就消失了!幸运的是,所有来自db的响应都及时出现了)))在JS世界中潜入的自然错误。请记住:必须等待第三方响应的所有操作都是异步完成的。它可以是db查询请求、一些api请求、监视事件的东西等等(当我将变量从本地更改为全局时,它就消失了!幸运的是,db的所有响应都及时出现了)))
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) );
});