我的nodejs代码出错

时间:2017-01-01 02:39:19

标签: 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;
        }
    });

    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
            });
        }
    });
});

这是我的节目路线代码。

注意:如果我重新加载页面,则错误消失并且页面打开。

2 个答案:

答案 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时,不会初始化变量papres.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。

解决方案1:使用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
                        });
                    }
                });
            }
        });
    }
});

解决方案2:嵌套回调

int a[]