我想使用express 4提供单个html页面。它曾用于以前版本的Express,但现在它告诉我“没有指定默认引擎且没有提供扩展”。非常感谢提前。
var express = require('express');
var path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var app = express();
var router = express.Router();
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static( path.join(__dirname, 'public')));
router.get('/', function(req, res) {
res.render('public/main.html');
});
module.exports = app;
下面的图书馆信息
"dependencies": {
"express": "~4.9.0",
"body-parser": "~1.8.1",
"cookie-parser": "~1.3.3",
"morgan": "~1.3.0",
"serve-favicon": "~2.1.3",
"debug": "~2.0.0",
"jade": "~1.6.0"
},
下面是使用Express 3的相同示例,它可以正常工作。
var express = require('express');
var path = require('path');
var app = express();
app.use(express.static(path.join(__dirname, 'public')));
app.get("/", function (req, res) {
res.sendfile('public/main.html');
});
module.exports = app;
以下是从Express 4提供静态html的正确方法。感谢E_net4和NarendraSoni的答案(1和2)。要使它工作,你必须避免使用Express'路由器,即express.Router().get('/')
,因为它将调用Express应用程序的模板引擎。
var express = require('express');
var path = require('path');
var app = express();
app.use(express.static( path.join(__dirname, 'public')));
app.get('/', function(req, res) {
res.sendfile('public/main.html');
});
module.exports = app;
答案 0 :(得分:3)
res.render
将调用Express应用程序的模板引擎,但您尚未指定。
Express在响应对象中提供sendFile
函数,允许您在不通过模板引擎的情况下发送静态页面文件。
var router = express.Router();
router.get('/', function(error, res) {
var options = {root: __dirname};
res.sendFile('something.txt', options, function(error) {
if (error) {
res.writeHead(500);
res.end();
}
});
});
在你的代码中还有其他一些看起来很可疑的东西。您已创建路由器,但未显示应用程序中包含的位置。可能正在发生一些依赖模板引擎的其他中间件正在拦截请求。
app.use('/', router);
另请注意,在这种情况下您无需创建新路由器。应用程序的行为就像路由器一样。
答案 1 :(得分:2)
如果您只需要提供一个文件,可以用以下代码替换路由器:
var fs = require('fs');
router.get('/', function(req, res) {
fs.readFile('public/main.html', function (err, html) {
res.writeHeader(200, {"Content-Type": 'text/html'});
res.write(html);
res.end();
});
});
答案 2 :(得分:2)
你做的一切都是正确的,只是有一个非常小的错误。 :)
将您的路线定义编辑为:
app.get('/', function(req, res) {
res.sendFile('main.html');
});
现在你已经包括:
app.use(express.static(path.join(__dirname, 'public')));
因此您无需在 main.html 中添加公开。
就是这样,享受,你的代码现在应该可以正常工作。
答案 3 :(得分:0)
从技术上讲,如果你只想提供静态html文件,你只需要这一行:
app.use(express.static( path.join(__dirname, 'public')));
意味着如果您从根目录获取GET /main.html,则无需再键入任何其他代码即可静态提供。
使用:
app.get('/', function(req, res) {
res.sendFile('main.html');
});
您正在使用为快速应用程序的根目录而不是路由器()定义的路由,如明文中所述:
路由方法派生自其中一个HTTP方法,并附加到快速类的实例。
以下代码是为其定义的路由示例 获取应用程序根目录的方法。
// GET method route
app.get('/', function (req, res) {
res.send('GET request to the homepage');
});
所以这里发生的是你正在使用为express应用程序的根定义的路由,而不是为express.Router()定义的路由。
如果您想使用Router()以相同的方式路由事物,您可以尝试这样的代码:
//app.use(express.static(path.join(__dirname, 'public')));
var router = express.Router();
app.use('/', router);
/* GET home page. */
router.get('/', function(req, res) {
res.sendFile(__dirname + '/path/to/file.html');
});
所以,你不必避免使用express.Router(),你只需要使用快递应用程序根目录中的路由,或者以明显不同的方式使用express.Router()的路由