【问题标题】:Node Express ejs Error: Failed to lookup view "error" in views directoryNode Express ejs 错误:无法在视图目录中查找视图“错误”
【发布时间】:2015-08-19 11:52:05
【问题描述】:

我正在用 ejs 和 mongoose 制作一个 express 应用程序。

我收到此错误:

 Error: Failed to lookup view "error" in views directory "/Users/ben/Documents/csMSc/web/site/app/views"
at EventEmitter.app.render (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/application.js:555:17)
at ServerResponse.res.render (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/response.js:938:7)
at module.exports (/Users/ben/Documents/csMSc/web/site/app/app.js:94:7)
at Layer.handle_error (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/layer.js:58:5)
at trim_prefix (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:300:13)
at /Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:270:7
at Function.proto.process_params (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:321:12)
at IncomingMessage.next (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:261:10)
at fn (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/response.js:933:25)
at EventEmitter.app.render (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/application.js:557:14)
at ServerResponse.res.render (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/response.js:938:7)
at app.use.res.render.message (/Users/ben/Documents/csMSc/web/site/app/app.js:83:9)
at Layer.handle_error (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/layer.js:58:5)
at trim_prefix (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:300:13)
at /Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:270:7
at Function.proto.process_params (/Users/ben/Documents/csMSsc/web/site/app/node_modules/express/lib/router/index.js:321:12)   

来自对res.render() 的两次调用,其中传入的数据来自猫鼬查询,例如:

  if(req.query.author !== undefined) {
        var author = req.query.author;
        Post.find().where('author').equals(author).sort({ created: -1 }).limit(10).exec(function(err, authorsPosts) {
            if (err) return res.send("error");
            if(authorsPosts.length==0) {
                res.render('pages/index', {
                    viewDataSignStatus: viewDataSignedIn[signedIn],
                    previews: authorsPosts,
                    error: "Sorry there are no posts with that tag."
                });
            } else {
                res.render('pages/index', {
                    viewDataSignStatus: viewDataSignedIn[signedIn],
                    previews: authorsPosts
                });
            }
        });
    }

另一个是相同的,但查询为

    Post.find( { tags : { $elemMatch: { $in : tagList } } } ).limit(10).exec(function(err, taggedPosts) {

但是,我在此视图上的所有其他渲染调用都可以正常工作,包括稍后在同一函数中的调用:

 //or just latest
    Post.find().sort({ created: 1 }).limit(10).exec(function(err, latestPosts) {
        if (err) return res.send(err);
        res.render('pages/index', {
            viewDataSignStatus: viewDataSignedIn[signedIn],
            previews: latestPosts
        });
    });

我很确定 latestPosts 的格式与上面的 authorsPosts 格式完全相同。

没有调用错误来渲染视图。

上面传递给res.render('pages/index')的一些调用的错误数据是使用自定义过滤器传递的

//custom ejs filter, sets to default value if data not supplied
ejs.filters.get = function(obj, prop, def) {
  return obj[prop] === undefined ? def : obj[prop];
};

在文件 app/views/pages/index.ejs 中显示为

<p><%=: locals | get:'error','' %> </p>

我的 ejs 设置如下:

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.engine('ejs', require('ejs').renderFile);

这就是整个令人讨厌的路由功能的可怕荣耀

router.get('/', function(req, res, next) {
    var accountController = new AccountController(User, req.session);
    console.log("here1");
    var signedIn = accountController.session.userProfileModel !== undefined ? 1 : 0;
    console.log("here2");

    //Author search
    if(req.query.author !== undefined) {
        var author = req.query.author;
        Post.find().where('author').equals(author).sort({ created: -1 }).limit(10).exec(function(err, authorsPosts) {
            if (err) return res.send("error");
            console.log("\n\nAuthorsPosts:" +authorsPosts);
            console.log("\n\authorsPosts.length: " +authorsPosts.length);
            console.log("authors post.constructor = " +authorsPosts.constructor);
            if(authorsPosts.length==0) {
                console.log("length=0");
                res.render('pages/index', {
                    viewDataSignStatus: viewDataSignedIn[signedIn],
                    previews: authorsPosts,
                    error: "Sorry there are no posts with that tag."
                });
            } else {
                res.render('pages/index', {
                    viewDataSignStatus: viewDataSignedIn[signedIn],
                    previews: authorsPosts
                });
            }
        });
    }
    //Tag search
    if(req.query.filter !== undefined) {
        var tagList = req.query.filter.constructor == Array ? req.query.filter : req.query.filter.split(",");
        Post.find( { tags : { $elemMatch: { $in : tagList } } } ).limit(10).exec(function(err, taggedPosts) {
            if (err) return res.send("error");
            console.log("\n\taggedPosts.length: " +taggedPosts.length);
            if(taggedPosts.length==0) {
                console.log("length=0");

                res.render('pages/index', {
                    viewDataSignStatus: viewDataSignedIn[signedIn],
                    previews: taggedPosts,
                    error: "Sorry there are no posts with that tag."
                });
            } else {
                console.log("\n\ntaggedPosts:\n\n" +taggedPosts);
                res.render('pages/index', {
                    viewDataSignStatus: viewDataSignedIn[signedIn],
                    previews: taggedPosts
                });
            }
        });
    }
    //or just latest
    Post.find().sort({ created: 1 }).limit(10).exec(function(err, latestPosts) {
        if (err) return res.send(err);
        res.render('pages/index', {
            viewDataSignStatus: viewDataSignedIn[signedIn],
            previews: latestPosts
        });
    });
});

更重要的是,它并非完全不起作用。当代码到达那些渲染调用时,它会抛出错误并且页面通常会冻结,您无法单击任何链接,然后如果我重新加载一次或两次它将起作用,并使用正确的数据渲染模板。

当我使用这些查询字符串中的一个前往“/”时,例如GET /?filter=Marc%20Behrens 它会打印所有返回的帖子,然后抛出错误。

谢谢!

编辑:感谢亚历克斯福特。

新的错误是:

Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:690:11)
    at ServerResponse.header (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/response.js:700:10)
    at ServerResponse.send (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/response.js:154:12)
    at ServerResponse.json (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/response.js:240:15)
    at ServerResponse.send (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/response.js:142:21)
    at module.exports (/Users/ben/Documents/csMSc/web/site/app/app.js:100:9)
    at Layer.handle_error (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/layer.js:58:5)
    at trim_prefix (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:300:13)
    at /Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:270:7
    at Function.proto.process_params (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:321:12)
    at next (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:261:10)
    at Layer.handle_error (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/layer.js:60:5)
    at trim_prefix (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:300:13)
    at /Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:270:7
    at Function.proto.process_params (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:321:12)
    at next (/Users/ben/Documents/csMSc/web/site/app/node_modules/express/lib/router/index.js:261:10)

【问题讨论】:

  • 您的新错误意味着您正在尝试处理已发送的响应。您在某个地方调用res.sendres.render,然后稍后再调用它。您能否发布更完整的应用程序代码示例,或者如果它是公开的,甚至可以发布到存储库的链接?我很乐意进行调查。
  • 是的,我自己看不到它发生在哪里。整个应用程序都在这里:github.com/bcrabbe/songsphere 非常感谢!

标签: node.js mongodb express mongoose ejs


【解决方案1】:

我对“标头已发送”错误的猜测是,即使上述 if 语句之一运行,您的 // or just latest 代码仍在运行。如果是这种情况,那么您肯定会多次致电res.renderres.send。试试这个:

router.get('/', function(req, res, next) {

  /* ... */

  //Author search
  if(req.query.author !== undefined) {
    /* ... */
      if(authorsPosts.length==0) {
        res.render(/*...*/);
      } else {
        res.render(/*...*/);
      }
    /* ... */
  }
  //Tag search
  else if(req.query.filter !== undefined) {
    /* ... */
      if(taggedPosts.length==0) {
        res.render(/*...*/);
      } else {
        res.render(/*...*/);
      }
    /* ... */
  }
  //or just latest
  else {
    res.render(/*...*/);
  }
});

【讨论】:

  • 太棒了!很高兴我能再次提供帮助:P
【解决方案2】:

我没有做对的是在路由目录中省略扩展名 .html。

router.get('/', function(req, res, next) {
    res.render('index');                 //change from index to index.html
});

router.get('/', function(req, res, next) {
    res.render('index.html');
});

【讨论】:

    【解决方案3】:

    我有这个错误,但使用 jsx 引擎。我通过确保我的视图文件夹中的文件是正确的扩展名*.jsx 来修复它。我确实有它只是index.js

    【讨论】:

      【解决方案4】:

      您遇到了一个错误,默认的快速错误处理程序正试图通过呈现错误视图向用户显示错误。您是否使用生成器来生成您的初始应用程序?如果是这样,您是否从 views 目录中删除了错误视图?

      要么更改默认的快速错误处理程序(可能在您的app.js 中),以便它只是吐出原始错误而不是尝试将其呈现为漂亮的小视图,或者添加它正在寻找的错误视图。

      express-cli 生成的错误处理程序通常如下所示:

      app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
          message: err.message,
          error: err
        });
      });
      

      请注意,它正在尝试 render('error' 并未能找到名为“错误”的视图。使它成为错误处理程序的原因很简单,即它接受 4 个参数,第一个是错误。 Express 知道如果捕获到错误,它应该跳到那个处理程序。

      至于导致错误处理程序运行的实际错误,我不确定。您需要修复它,以便正确显示错误,然后您才能从那里进行调试。

      【讨论】:

      • 谢谢!一直以来,我一直在思考“为什么节点错误如此无用”。在中编辑了新的错误消息
      • 太棒了,我很高兴能帮上忙。如果它解决了您的问题,请务必接受答案^_^
      猜你喜欢
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 2016-01-27
      • 2017-01-14
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多