Nodejs初学,在学习MYBOLG的例子时,使用req.flash('error', '!')时,报错 Failed to lookup view 'error'

Nodejs初学,在学习MYBOLG的例子时,使用req.flash(‘error’, ‘!’)时,报错 Failed to lookup view ‘error’

//代码如下 router.post(’/reg’, function(req, res) { var name = req.query.name, password = req.body.password, password_re = req.body[‘password-repeat’];

//检验用户两次输入的密码是否一致
if (password_re != password) {
    req.flash('error', '两次输入的密码不一致!');
    return res.redirect('/reg');//返回主册页
}

错误日志:

Error: Failed to lookup view “error” in views directory “D:\WORK\node\mytest\vie ws” at Function.app.render (D:\WORK\node\mytest\node_modules\express\lib\applica tion.js:492:17) at ServerResponse.res.render (D:\WORK\node\mytest\node_modules\express\lib\r esponse.js:802:7) at Layer.module.exports [as handle] (D:\WORK\node\mytest\app.js:67:9) at trim_prefix (D:\WORK\node\mytest\node_modules\express\lib\router\index.js :235:17) at D:\WORK\node\mytest\node_modules\express\lib\router\index.js:208:9 at Function.proto.process_params (D:\WORK\node\mytest\node_modules\express\l ib\router\index.js:269:12) at IncomingMessage.next (D:\WORK\node\mytest\node_modules\express\lib\router \index.js:199:19) at fn (D:\WORK\node\mytest\node_modules\express\lib\response.js:797:25) at Function.app.render (D:\WORK\node\mytest\node_modules\express\lib\applica tion.js:494:14) at ServerResponse.res.render (D:\WORK\node\mytest\node_modules\express\lib\r esponse.js:802:7)

app.js如下 var fs = require(‘fs’); var accessLog = fs.createWriteStream(‘access.log’, {flags: ‘a’}); var errorLog = fs.createWriteStream(‘error.log’, {flags: ‘a’});

var express = require(‘express’); var path = require(‘path’); var favicon = require(‘static-favicon’); var logger = require(‘morgan’); var cookieParser = require(‘cookie-parser’); var bodyParser = require(‘body-parser’);

var routes = require(’./routes/index’);

var session = require(‘express-session’);

var MongoStore = require(‘connect-mongo’)(session); var settings = require(’./settings’);

var flash = require(‘connect-flash’); var app = express();

// view engine setup app.set(‘views’, path.join(__dirname, ‘views’)); app.set(‘view engine’, ‘ejs’); app.use(flash());

app.use(favicon()); app.use(logger(‘dev’)); app.use(bodyParser.json()); app.use(bodyParser.urlencoded()); app.use(cookieParser()); app.use(express.static(path.join(__dirname, ‘public’)));

//app.use(’/’, routes);

routes(app);

app.use(session({ secret:settings.cookieSecret, key:settings.db, saveUninitialized: true, resave: true, cookie:{maxAge:100060602430}, store:new MongoStore({db:settings.db}) })); /// catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error(‘Not Found’); err.status = 404; next(err); });

/// error handlers

// development error handler // will print stacktrace if (app.get(‘env’) === ‘development’) { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render(‘error’, { message: err.message, error: err }); }); }

// production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); res.render(‘error’, { message: err.message, error: {} }); });

module.exports = app;


12 回复

Nodejs初学,在学习MYBOLG的例子时,使用req.flash('error', '!')时,报错 Failed to lookup view 'error'

问题描述

在使用 req.flash('error', '两次输入的密码不一致!') 时,出现了以下错误:

Error: Failed to lookup view "error" in views directory "D:\WORK\node\mytest\views"

这意味着Express无法找到名为 error 的视图文件。

示例代码

router.js

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

router.post('/reg', function(req, res) {
    var name = req.query.name,
        password = req.body.password,
        password_re = req.body['password-repeat'];

    // 检验用户两次输入的密码是否一致
    if (password_re !== password) {
        req.flash('error', '两次输入的密码不一致!');
        return res.redirect('/reg'); // 返回注册页
    }

    // 其他逻辑
});

module.exports = router;

app.js

var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);

var routes = require('./routes/index');

var flash = require('connect-flash');
var app = express();

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

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use(flash());

app.use(session({
    secret: settings.cookieSecret,
    key: settings.db,
    saveUninitialized: true,
    resave: true,
    cookie: { maxAge: 1000 * 60 * 60 * 24 * 30 },
    store: new MongoStore({ db: settings.db })
}));

app.use('/', routes);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});

module.exports = app;

解决方法

  1. 创建 error.ejs 文件: 在 views 目录下创建一个名为 error.ejs 的文件。此文件用于渲染错误信息。

    <!-- views/error.ejs -->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Error</title>
    </head>
    <body>
        <h1><%= message %></h1>
    </body>
    </html>
    
  2. 确保正确配置视图引擎: 确保在 app.js 中设置了正确的视图引擎(如EJS)。

通过以上步骤,您可以解决 Failed to lookup view 'error' 错误,并确保在出现错误时能够正确渲染错误页面。


有哪位前辈知道的,麻烦告诉下

有人知道为什么吗?来个热心人告诉我下吧

教程太旧了。

你可以把你的错误日志发出来。

看你的描述视乎是说找不到 error 这张页面。

的确像你说的那样,是找不到ERROR这个VIEW,但FLASH这个模块根本不需要用到这个VIEW啊,错误就发生在req.flash()这句 错误日志: Error: Failed to lookup view “error” in views directory "D:\WORK\node\mytest\vie ws" at Function.app.render (D:\WORK\node\mytest\node_modules\express\lib\applica tion.js:492:17) at ServerResponse.res.render (D:\WORK\node\mytest\node_modules\express\lib\r esponse.js:802:7) at Layer.module.exports [as handle] (D:\WORK\node\mytest\app.js:67:9) at trim_prefix (D:\WORK\node\mytest\node_modules\express\lib\router\index.js :235:17) at D:\WORK\node\mytest\node_modules\express\lib\router\index.js:208:9 at Function.proto.process_params (D:\WORK\node\mytest\node_modules\express\l ib\router\index.js:269:12) at IncomingMessage.next (D:\WORK\node\mytest\node_modules\express\lib\router \index.js:199:19) at fn (D:\WORK\node\mytest\node_modules\express\lib\response.js:797:25) at Function.app.render (D:\WORK\node\mytest\node_modules\express\lib\applica tion.js:494:14) at ServerResponse.res.render (D:\WORK\node\mytest\node_modules\express\lib\r esponse.js:802:7)

看了新教程,使用EXPRESS最新版,还是报这个错误

myblog这个例子,如此调用,是不会报这个错误的,但我用的是EXPRESS4.X,我怀疑是我哪个地方的配置有问题

当然有问题了,这个例子是3.0版本的,可以这样使用: app.use(function(req, res, next){

    var error=req.flash('error');
var success=req.flash('success');
res.locals.user = req.session.user;
console.log("user");
res.locals.error = error.length?error:null;

res.locals.success = success.length?success:null;
next();

});

我也出现过这种情况。 你app.js里面配置的app.set(‘view engine’, ‘html’); 或者 app.set(‘view engine’, ‘ejs’); 与views/error的后缀一样吗

当你在使用 req.flash('error', '!') 时遇到 Failed to lookup view 'error' 错误,通常是因为你的应用尝试渲染一个名为 error 的视图文件,但找不到该文件。你可以通过以下步骤来解决这个问题:

  1. 创建 error.ejs 视图文件:确保在 views 目录下有一个名为 error.ejs 的文件。如果该文件不存在,创建它,并添加一些基本的 HTML 结构。
<!-- views/error.ejs -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Error</title>
</head>
<body>
    <h1><%= message %></h1>
</body>
</html>
  1. 检查错误处理中间件:确保错误处理中间件能够正确地渲染 error.ejs 文件。你的 app.js 中已经有这样的处理逻辑:
// development error handler
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});
  1. 确保正确的闪现消息使用:确保你在控制器中正确地使用了 req.flash 方法。你的代码片段看起来是正确的,但需要确保 connect-flash 插件已经正确安装并配置。
router.post('/reg', function(req, res) {
    var name = req.body.name,
        password = req.body.password,
        password_re = req.body['password-repeat'];

    if (password_re != password) {
        req.flash('error', '两次输入的密码不一致!');
        return res.redirect('/reg');
    }
});

确保你的代码中使用的 req.body 数据字段与表单提交的数据字段匹配。

回到顶部