带有Express.js的自定义404页面

时间:2015-08-13 09:51:10

标签: javascript node.js express

我正在尝试在抛出404错误时重定向到html页面。我的公共文件夹中有一个标题为:404的文件夹。这是index.js中的代码:

var express = require('express');
var app = express();

app.use(express.static(__dirname + "/public"));

app.route('/me').get(function(req, res){

res.sendFile(__dirname+'/public/html/contacts.html')


})

app.use(function(req, res, next){

// res.type('txt').send('Not found');
// res.status(404).end('error');

  if (req.accepts('html')) {
    res.render('404', { url: req.url });
    return;
  }

});



var server = app.listen(8000, function(){

console.log("Server is happening %s", server.address().port);

});

但是我收到以下错误:

错误:未指定默认引擎且未提供扩展名。     在新视图(/home/pi/server/node_modules/express/lib/view.js:62:11)     在EventEmitter.render(/home/pi/server/node_modules/express/lib/application.js:569:12)     在ServerResponse.render(/home/pi/server/node_modules/express/lib/response.js:961:7)     在/home/pi/server/index.js:19:9     在Layer.handle [as handle_request](/home/pi/server/node_modules/express/lib/router/layer.js:95:5)     在trim_prefix(/home/pi/server/node_modules/express/lib/router/index.js:312:13)     在/home/pi/server/node_modules/express/lib/router/index.js:280:7     在Function.process_params(/home/pi/server/node_modules/express/lib/router/index.js:330:12)     在下一个(/home/pi/server/node_modules/express/lib/router/index.js:271:10)     在SendStream.error(/home/pi/server/node_modules/express/node_modules/serve-static/index.js:120:7) 错误:未指定默认引擎且未提供扩展名。     在新视图(/home/pi/server/node_modules/express/lib/view.js:62:11)     在EventEmitter.render(/home/pi/server/node_modules/express/lib/application.js:569:12)     在ServerResponse.render(/home/pi/server/node_modules/express/lib/response.js:961:7)     在/home/pi/server/index.js:19:9     在Layer.handle [as handle_request](/home/pi/server/node_modules/express/lib/router/layer.js:95:5)     在trim_prefix(/home/pi/server/node_modules/express/lib/router/index.js:312:13)     在/home/pi/server/node_modules/express/lib/router/index.js:280:7     在Function.process_params(/home/pi/server/node_modules/express/lib/router/index.js:330:12)     在下一个(/home/pi/server/node_modules/express/lib/router/index.js:271:10)     在SendStream.error(/home/pi/server/node_modules/express/node_modules/serve-static/index.js:120:7)

3 个答案:

答案 0 :(得分:2)

如果您可以将404页面调整为静态页面,则可以执行以下操作:

res.sendFile('/path/to/404.html');

相反,如果你想要渲染一些视图模型对象(例如{url: req.url}),你必须决定模板引擎(例如,Jade,EJS,Handlebars)。例如,假设您要使用jade,首先将其作为依赖项安装:

npm install jade

然后,您应该在脚本的开头添加以下行:

app.set('view', path.join(__dirname, 'private/view/path'));
app.set('view engine', 'jade');

模板引擎到位后,您可以执行以下操作:

res.render('viewName', viewModelObject)

viewName将被解析为./private/view/path/viewName.jade。因此,假设存在./private/view/path/404.jade,您可以这样做:

res.render('404', { url: req.url });

请务必将模板(即您的.jade文件)保留在用户无法访问的位置。

答案 1 :(得分:0)

app.use(function(req, res, next) {
      var err = new Error('Not Found');
      err.status = 404;
      next(err);
    });

答案 2 :(得分:0)

对于response.render方法,你必须使用像ejs这样的模板引擎。

您必须设置视图选项。

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

但是如果你把404文件放在公共文件夹中,那么你可以简单地使用sendfile或重定向到静态路径。