二次损坏:Express.js没有看到错误页面.主要损伤:?新人'Mongoose的错误

Secondary damage: Express.js sees no error page. Primary damage: ?newcomer's Mongoose mistake?

本文关键字:错误 新人 Mongoose Express 损坏 二次 js      更新时间:2023-09-26

我在500发现了一个类似的问题错误:查找视图失败"索引";在视图目录中,但我认为我已经涵盖了扩展。

为了能够使用类似HTML的模板,我在我的app.js:中

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

在视图目录中,我有error.htmlerror.jade和一个零字节的error文件。error.html缺少有趣的格式,但包含:

<!DOCTYPE html>
<html>
  <head>
    <title>Error</title>
  </head>
  <body>
  <%= message =>
  <%= error.status =>
  <%= error.stack =>
  </body>
</html>

当我试图访问一个页面来创建一个用户帐户(通过在Mongoose中添加一个条目(时,我在尝试保存时遇到了一个错误:

Error: Failed to lookup view "error" in views directory "/Users/jonathan/server/views"
    at EventEmitter.app.render (/Users/jonathan/server/node_modules/express/lib/application.js:555:17)
    at ServerResponse.res.render (/Users/jonathan/server/node_modules/express/lib/response.js:938:7)
    at module.exports (/Users/jonathan/server/app.js:106:7)
...

这可能是由于在我尝试插入数据库时失败后,未能报告错误页面而造成的二次损坏。

我相信主要的伤害是Mongoose;我认为相关的代码是:

var schema = mongoose.Schema;
var user_details = new schema(
  {
  username: String,
  password: String
  },
  {
  collection: 'userInfo'
  });
passport.use(new local_strategy(function(username, password, done)
  {
  process.nextTick(function()
    {
    user_details.findOne(
      {
      'username': username,
      }, function(err, user)
      {
      if (err)
        {
        return done(err);
        }
      if (!user)
        {
        return done(null, false);
        }
      if (user.password !== password)
        {
        return done(null, false);
        }
      return done(null, user);
      });
    });
  }));

在我的routes/index.js中,到/newuser的POST的处理程序是:

router.post('/newuser', function(request, response, next)
  {
  var newuser = new user_details(
    {
    'username': request.params.username,
    'password': request.params.password
    });
  newuser.save();
  });

--更新--

根据评论中的请求,以下是我的app.js文件:

var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var express = require('express');
var favicon = require('serve-favicon');
var logger = require('morgan');
var mongoose = require('mongoose/');
var path = require('path');
var routes = require('./routes/index');
var users = require('./routes/users');
var passport = require('passport');
var local_strategy = require('passport-local').Strategy;
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
app.use(favicon(__dirname + '/public/favicon.ico'));
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')));
// app.use(app.router);
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user, done)
  {
  done(null, user);
  });
passport.deserializeUser(function(user, done)
  {
  done(null, user);
  });
var schema = mongoose.Schema;
var user_details = new schema(
  {
  username: String,
  password: String
  },
  {
  collection: 'userInfo'
  });
passport.use(new local_strategy(function(username, password, done)
  {
  process.nextTick(function()
    {
    user_details.findOne(
      {
      'username': username,
      }, function(err, user)
      {
      if (err)
        {
        return done(err);
        }
      if (!user)
        {
        return done(null, false);
        }
      if (user.password !== password)
        {
        return done(null, false);
        }
      return done(null, user);
      });
    });
  }));
app.use('/', routes);
app.use('/users', users);
// 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: {}
  });
});
var server = app.listen(8000, function()
  {
  console.log('Server running.');
  });
module.exports = app;

--进一步更新--

现在,在创建了index.ejs之后,我得到了一个错误:

Error: Could not find matching close tag for "<%=".
   at /Users/jonathan/server/node_modules/ejs/lib/ejs.js:514:19
   at Array.forEach (native)
   at Object.Template.generateSource  (/Users/jonathan/server/node_modules/ejs/lib/ejs.js:501:15)
   at Object.Template.compile (/Users/jonathan/server/node_modules/ejs/lib/ejs.js:423:12)
   at Object.compile (/Users/jonathan/server/node_modules/ejs/lib/ejs.js:288:16)
   at handleCache (/Users/jonathan/server/node_modules/ejs/lib/ejs.js:147:16)
   at View.exports.renderFile [as engine] (/Users/jonathan/server/node_modules/ejs/lib/ejs.js:350:14)
   at View.render (/Users/jonathan/server/node_modules/express/lib/view.js:93:8)
   at EventEmitter.app.render (/Users/jonathan/server/node_modules/express/lib/application.js:566:10)
   at ServerResponse.res.render (/Users/jonathan/server/node_modules/express/lib/response.js:938:7)
   at module.exports (/Users/jonathan/server/app.js:106:11)
   at Layer.handle_error (/Users/jonathan/server/node_modules/express/lib/router/layer.js:58:5)
   at trim_prefix (/Users/jonathan/server/node_modules/express/lib/router/index.js:300:13)
   at /Users/jonathan/server/node_modules/express/lib/router/index.js:270:7
   at Function.proto.process_params (/Users/jonathan/server/node_modules/express/lib/router/index.js:321:12)
   at IncomingMessage.next (/Users/jonathan/server/node_modules/express/lib/router/index.js:261:10)

错误页面来源如上所述。

我能做些什么来(理想情况下(解决主要损害?

谢谢,

 app.engine('html', require('ejs').renderFile);
 app.set('view engine', 'ejs');

这两条线可能相互冲突。删除第一行,删除所有的.jaed和.html文件,只保留.ejs文件。将您的error.html更改为error.ejs。一切都应该按预期进行。