【问题标题】:Problem in rendering ejs template with Express使用 Express 渲染 ejs 模板时出现问题
【发布时间】:2023-03-19 16:24:01
【问题描述】:

我将 Node.js 与 Express 和 EJS 一起使用。

下面是我的代码:

var express = require('express');
var path = require('path');
var bodyParser = require('body-parser');

var app = express();
var urlencodedParser = bodyParser.urlencoded({ extended: false });
var publicPath = path.resolve(__dirname, 'public');
app.use(express.static(publicPath));
//app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');

app.get('/form_get.html', (req, res) => {
    res.sendFile(__dirname + "/" + "form_get.html")
})

app.get('/process_get', (req, res) => {

    console.log(req.query.first_name);
    res.render(path.join(__dirname+'/views/thankyou.ejs'), { name: req.query.first_name});
    
})

var server = app.listen(3000, () => {
    
    var host = server.address().address;
    var port = server.address().port;
    console.log(`Example app listening at ${host}:${port}`);
})

我的文件夹结构如下:

  • mysql(文件夹)
    • node_modules(文件夹)
    • app4.js(文件)
    • package.json(文件)
    • public(文件夹,它包含form_get.html)
    • views(文件夹,它包含thankyou.ejs)

问题是无法在视图文件夹中查找thankyou.ejs

我收到以下错误消息:

错误:无法在视图目录中查找视图“thankyou.ejs” “.../mysql/views”

可能是什么问题?

【问题讨论】:

  • 请提供您的文件夹和文件项目结构 ;-)

标签: javascript node.js express ejs node-modules


【解决方案1】:

渲染ejs 文件时,您不需要使用绝对路径,因为默认情况下它会在views 文件夹中查找。此外,您不需要指定扩展名.ejs。试试这个:

var express = require('express');
var path = require('path');
var bodyParser = require('body-parser');

var app = express();
var urlencodedParser = bodyParser.urlencoded({ extended: false });
var publicPath = path.resolve(__dirname, 'public');
app.use(express.static(publicPath));
//app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');

app.get('/form_get.html', (req, res) => {
    res.sendFile(__dirname + "/" + "form_get.html")
})

app.get('/process_get', (req, res) => {

    console.log(req.query.first_name);
    res.render('thankyou', { name: req.query.first_name});
    
})

var server = app.listen(3000, () => {
    
    var host = server.address().address;
    var port = server.address().port;
    console.log(`Example app listening at ${host}:${port}`);
})

【讨论】:

  • 错误仍然存​​在。
  • 您能否提供您的文件夹和文件项目结构的图像?您可以编辑您的问题。
  • 请解释一下这个问题是什么时候发生的?在你之后.....?
  • 取消注释设置视图文件夹的行。
  • 我试过了,但问题仍然存在。
【解决方案2】:

当您使用app.set('view engine', 'ejs'); 时,请务必注意res.render() 将在views 文件夹中查找视图。 在这种情况下


我镜像了你的项目,它通过几个微小的变化运行良好......


项目文件夹和文件结构。


app.js

var express = require("express");
var path = require("path");
var bodyParser = require("body-parser");

var app = express();
var urlencodedParser = bodyParser.urlencoded({ extended: false });
var publicPath = path.resolve(__dirname, "public");
app.use(express.static(publicPath));
app.set("view engine", "ejs");

app.get("/form_get", (req, res) => {
  res.sendFile(__dirname + "/" + "form_get.html");
});

app.get("/process_get", (req, res) => {
  res.render("thankyou");
});

var server = app.listen(3000, () => {
  var host = server.address().address;
  var port = server.address().port;
  console.log(`Example app listening at ${host}:http://localhost:${port}`);
});

输出:

http://localhost:3000/process_get (thankyou.ejs) 文件。


输出:

http://localhost:3000/form_get (form_get.html) 文件

【讨论】:

  • 您从 res.render 调用中删除了第二个参数。然后,我不明白为什么它对你有用。
  • @gm.devel 如果你愿意,你可以保留它,它无论如何都会起作用!!! ;-) 如果你想要证据,我很乐意把它寄给你 :-D ;-)
  • @gm.devel 尝试使用res.render("thankyou", { name: req.query.first_name }); 运行您的代码,它仍然有效! ! !
  • 它不起作用。我正在使用节点版本 12.18.3
  • node 16.13.0, npm 8.3.0, "ejs": "^3.1.6", "express": "^4.17.2" 尝试更新你的 node&npm 版本并记住在编码过程中,谦虚是非常重要的,并且能够承认自己错了,否则这是一项不可能完成的任务祝你好运,致以最诚挚的问候!
猜你喜欢
  • 2015-07-17
  • 2015-10-21
  • 2012-05-08
  • 1970-01-01
  • 2021-04-27
  • 2016-02-26
  • 1970-01-01
  • 2012-05-15
  • 2016-11-01
相关资源
最近更新 更多