2015-07-02 1 views
0

Я нашел аналогичный вопрос в 500 Error: Failed to lookup view "index" in views directory, но я думал, что у меня есть расширения.Вторичный урон: Express.js не видит страницы с ошибкой. Первичный ущерб: ошибка «новичка» Мангуста?

Для того, чтобы иметь возможность работать с 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.html, error.jade и нулевые байты error файл а. error.html не хватает интересное форматирования, но содержит:

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

Когда я пытаюсь получить доступ к странице, чтобы создать учетную запись пользователя (путем добавления записи в Мангусте), я получаю сообщение об ошибке при попытке сэкономить:

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); 
     }); 
    }); 
    })); 

В моем маршрутах/index.js, обработчик для сообщения в/новый_пользователе является:

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

--UPDATE--

Per запрос в комментарии, вот мой 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; 

--FURTHER UPDATE--

Теперь, после создания 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) 

ошибка является как указано выше.

Что я могу (в идеале) устранить основной ущерб?

Спасибо,

+0

Не могли бы вы также добавить файл app.js? Кроме того, почему у вас есть три файла ошибок в вашем представлении вместо одного? Наконец, вы должны использовать этот «ответ» в своем router.post, чтобы отвечать новыми данными или отображать представление пользователю после выполнения действия сохранения. –

+0

Почему бы не принять сообщение об ошибке по номиналу? Не найти ресурс не найти ресурс. – user2864740

+0

@ user2864740, я понимаю, что ресурс не найден. Я пытаюсь выяснить, почему он не находит «ошибку», когда ему сказали искать «html», и есть view/error.html. – JonathanHayward

ответ

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

Эти две линии, возможно, конфликтующие друг с другом. Удалите первую строку, удалите все файлы .jade и .html и сохраните только файлы .ejs. Измените свой error.html на error.ejs. Все должно работать должным образом.

+0

Я реализовал это изменение, и теперь я получаю '' <% = '' traceback трассировки на всех просмотрах страниц - не только создание новых учетных записей. – JonathanHayward

+0

Это потому, что они должны заканчиваться%> и not => –