请教个Nodejs express问题

请教个Nodejs express问题

代码如下,html文件变成文本输出了,有什么办法解决

var express = require(‘express’), http = require(“http”), app = module.exports = express();

app.engine(’.html’, require(‘ejs’).__express);

app.set(‘views’, __dirname + ‘/views’); app.use(express.directory(__dirname + ‘/views’)) app.use(express.static(__dirname + ‘/views’));

app.set(‘view engine’, ‘html’); var sever = http.createServer(app);


3 回复

当然可以。根据你提供的代码片段,看起来你在使用 Express 和 EJS 模板引擎来渲染 HTML 文件,但 HTML 文件似乎被直接作为文本输出而不是被渲染。这可能是因为模板引擎没有正确配置或者静态文件服务覆盖了模板渲染。

让我们检查并修改你的代码,确保 EJS 能够正确地渲染 HTML 文件。

修改后的代码

var express = require('express'),
    http = require('http'),
    app = module.exports = express();

// 设置模板引擎为 EJS,并指定 .html 为扩展名
app.engine('.html', require('ejs').__express);

// 设置视图目录
app.set('views', __dirname + '/views');

// 设置默认的视图引擎
app.set('view engine', 'html');

// 使用静态文件中间件
app.use(express.static(__dirname + '/views'));

// 创建 HTTP 服务器
var server = http.createServer(app);

// 定义一个路由来渲染视图
app.get('/', function(req, res) {
    res.render('index.html', { title: 'Hello from EJS' });
});

// 启动服务器
server.listen(3000, function() {
    console.log('Server is running on port 3000');
});

解释

  1. 设置模板引擎

    app.engine('.html', require('ejs').__express);
    

    这行代码将 .html 文件的渲染交给 EJS 处理。

  2. 设置视图目录

    app.set('views', __dirname + '/views');
    

    指定存放视图文件的目录。

  3. 设置默认的视图引擎

    app.set('view engine', 'html');
    

    设置默认的视图引擎为 html,这样你可以省略调用 res.render() 时的扩展名。

  4. 使用静态文件中间件

    app.use(express.static(__dirname + '/views'));
    

    这行代码允许你直接访问位于 views 目录下的静态文件(如 CSS、JavaScript 文件等)。

  5. 定义路由

    app.get('/', function(req, res) {
        res.render('index.html', { title: 'Hello from EJS' });
    });
    

    定义一个路由 /,当用户访问根路径时,会调用 res.render() 方法来渲染 index.html 文件。

  6. 启动服务器

    server.listen(3000, function() {
        console.log('Server is running on port 3000');
    });
    

    启动 HTTP 服务器,监听端口 3000。

注意事项

  • 确保 views 目录下有 index.html 文件。
  • 如果你想直接通过浏览器访问静态文件(例如 index.html),不需要在 app.use(express.static(...)) 中包含 views 目录,因为这会导致静态文件服务覆盖模板渲染。

希望这些修改能帮助你解决问题!


没有设置content-type吗?

从你提供的代码来看,有几个地方可能需要调整。首先,你需要确保EJS模板引擎被正确地设置,并且HTML文件被作为EJS模板正确处理。此外,express.directoryexpress.static 的使用也需要确认是否符合你的需求。

以下是修改后的代码示例:

var express = require('express'),
    http = require("http"),
    app = module.exports = express();

// 设置EJS为默认模板引擎
app.set('views', __dirname + '/views');
app.engine('.html', require('ejs').__express);
app.set('view engine', 'html');

// 使用静态文件中间件
app.use(express.static(__dirname + '/views'));

// 创建服务器
var server = http.createServer(app);

// 示例路由
app.get('/', function(req, res) {
    res.render('index.html', { title: 'Hello World' });
});

server.listen(3000);

解释

  1. 设置视图引擎:

    • app.set('views', __dirname + '/views'): 设置视图文件的目录。
    • app.engine('.html', require('ejs').__express): 设置 .html 文件由 EJS 处理。
    • app.set('view engine', 'html'): 设置默认的视图引擎为 HTML(实际上是 EJS)。
  2. 静态文件服务:

    • app.use(express.static(__dirname + '/views')): 允许访问 views 目录下的静态文件。
  3. 创建路由:

    • app.get('/', function(req, res) { ... }): 定义一个简单的路由,当访问根路径时渲染 index.html 模板。
  4. 启动服务器:

    • server.listen(3000): 在端口 3000 上启动 HTTP 服务器。

这样,当你访问应用的根路径时,index.html 会被当作 EJS 模板处理并渲染出来,而不是直接输出文本。确保 views 目录下有一个 index.html 文件,并且该文件中包含 EJS 语法(如 <%= title %>)。

回到顶部