Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我的nodejs代码中有错误_Javascript_Node.js_Express - Fatal编程技术网

Javascript 我的nodejs代码中有错误

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;

我将此代码作为一个客户项目来编写 当我去一个表演路线时,我得到了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
            });
        }
    });
});
这是我的表演路线代码


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

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