【问题标题】:Express.js HTTP 500 ERROR: Page works with res.send("Some text"); but does error caused when using res.render('file');Express.js HTTP 500 错误:页面使用 res.send("Some text");但是在使用 res.render('file'); 时会导致错误吗?
【发布时间】:2018-05-09 11:10:44
【问题描述】:

我有一个带有 /request 路由的页面,其中包含一个表单。表单方法是 POST,动作是 /requestrequest.js 中的 POST 处理程序中应该发生的事情是对表单数据进行处理(存储在 DB 等中),然后使用路由 /trips。

每当我使用 res.send("Some text here"); 时,GET 处理程序都可以正常工作但是当我尝试使用 res.render('trips') 渲染页面时,给我一个 HTTP 500 内部服务器错误。

这是 request.js 的代码:

var router = require('express').Router();


router.get('/', checkLoggedIn, function (req, res) {
    res.render('request', {
        user: req.user // get the user out of session and pass to template
    });
});

router.post('/', checkLoggedIn, function (req, res) {
    console.log(req.body); //data should be stored in DB
    res.redirect('/trips'); //Should redirect to /trips after form 
submission. Why ERROR 500?
});

function checkLoggedIn(req, res, next) {
    if (req.isAuthenticated()) {
        return next();
    }
    //Redirect to home if not logged in
    res.redirect('/');
}

module.exports = router;

这是 trips.js 的代码:

var router = require('express').Router();

router.get('/', checkLoggedIn, function(req, res) {
    res.send("This is the trips route GET response!");
});

所以 上面的部分工作 并打印 “这是旅行路线 GET 响应!” 当我访问 localhost:8000/trips(从导航栏或通过提交表格)

router.get('/', checkLoggedIn, function(req, res) {
    res.render('trips');
});

但是,当我写这篇文章时,它给了我一个 HTTP ERROR 500 localhost 当前无法处理这个请求。

function checkLoggedIn(req, res, next) {
    if (req.isAuthenticated()) {
        return next();
    }
    //Redirect to home if not logged in
    res.redirect('/');
}

module.exports = router;

这是我的 trips.ejs 文件(用于上下文):

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="utf-8">
    <!--<title><%= user.firstName %>'s Trips - Erkab</title>-->

    <!--<meta name="viewport" content="width=device-width, initial-scale=1">-->
    <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0"/>
    <meta name="apple-mobile-web-app-capable" content="yes"/>

    <link rel="stylesheet" href="/public/css/base.css">
    <link rel="stylesheet" href="/public/css/main.css">
    <link rel="stylesheet" href="/public/css/erkab.css">


    <script src="/public/js/modernizr.js"></script>

</head>

<body id="top" style="width: 100%">

<% include templates/header.ejs %>

<% if (userType != "Rider") {
    userType = "Driver";
} %>

<div id="changeableView" class="container-fluid">
      <table class="table table-hover">
        <thead class="thead-inverse">
        <tr>
            <th>#</th>
            <th>USER TYPE</th>
            <th>LOCATION</th>
            <th>DATE</th>
            <th>TIME</th>
        </tr>
        </thead>
        <tbody>
        <tr>
            <th scope="row">1</th>
            <td><%= userType %></td>
            <td><%= points %> - <%= area %></td>
            <td><%= date %></td>
            <td><%= time %></td>
        </tr>
        </tbody>
    </table>
</div>

<script src="/public/js/jquery-2.1.3.min.js"></script>
<script src="/public/js/main.js"></script>
</body>
</html>

【问题讨论】:

  • 您在 Node 控制台中看到了什么错误?这可能就像 EJS 文件尝试使用您未传入的变量一样简单。您可以尝试将该文件的内容更改为“Hello”之类的内容,以查看是否成功呈现。如果没有,也许您可​​以发布您用于配置设置 viewsview engine 的代码,以便我们再次检查您是否正确设置了这些设置?
  • 你好像问了两次同样的问题stackoverflow.com/questions/47486074/…

标签: javascript node.js http express server


【解决方案1】:

此问题的一些相关信息包含在您发布的另一份副本中:

Express.js: localhost is currently unable to handle this request. HTTP ERROR 500 (GET Request)

我建议将您在此处发布的代码更改为:

router.get('/', checkLoggedIn, function(req, res) {
    res.render('trips', {
        user: req.user,
        userType: 'Driver',
        area: null,
        points: null,
        date: null,
        time: null,
        driverPref: null,
    });
});

我认为您不需要所有这些,但是一旦渲染,您就可以进行整理。

我怀疑这里有两个真正的问题。一个是这一行:

<!--<title><%= user.firstName %>'s Trips - Erkab</title>-->

该“评论”不会阻止 EJS 尝试访问 user.firstName。就 EJS 而言,注释只是输出字符串的一部分,不会被视为任何特殊内容。

还有这个:

<% if (userType != "Rider") {

我相信这也会失败,因为 userType 不会被声明。

【讨论】:

  • 非常感谢@skirtle 的帮助。确实是 EJS 文件中使用的未传递变量导致了错误。例如,我认为页面应该使用 null 值呈现良好,但事实并非如此。
【解决方案2】:

res.render 用于使用一些模板引擎(如 mustache、jade 等)渲染静态模板文件。

所以你应该配置模板引擎,创建一个静态文件,然后 res.render('trips') 解释和渲染模板。

您可以在expresshere中找到有关如何使用模板引擎的信息

【讨论】:

  • 这很明显。我已经这样做了。在我的情况下,它应该呈现一个 .ejs 文件。
  • 视图是如何配置的?目录结构是什么?
  • 他们都在views目录
  • 可能是另一个明显的事情......你有 module.exports = router; 在 trips.js 的末尾吗?除此之外,我在本地进行了快速测试,删除了 checkLoggedIn 函数并将模拟数据传递给视图,一切似乎都对我有用。
  • 是的,最后确实有module.exports = router;。这才是真正让我沮丧的地方。它应该可以像我拥有的​​所有其他页面一样正常工作!无论如何,谢谢菲利波。
【解决方案3】:

尝试使用this tutorial 来发现您的错误:

在本例中,通用 logErrors 可能会将请求和错误信息写入 stderr,例如:

function logErrors (err, req, res, next) {   console.error(err.stack)  next(err) }

或者,您可以使用try-catch 语句。 here.

【讨论】:

  • 抱歉,我认为这并不能真正回答问题
  • 我并不是真的在寻找错误处理。我很想知道为什么会导致错误以及如何解决它。
  • 我明白了,那么您可以使用try-catch 找出您遇到的具体错误类型。
  • @Azuloo 我已经清楚地表明这是一个 HTTP 500 内部服务器错误。
  • @HeshamSaleh 是的,我在阅读您的帖子后理解了这一点,但是在错误的 种类 下,我不是指 HTTP 状态代码,而是指错误的正文。
猜你喜欢
  • 2022-11-02
  • 1970-01-01
  • 2020-05-21
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
相关资源
最近更新 更多