Я нашел аналогичный вопрос в 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)
ошибка является как указано выше.
Что я могу (в идеале) устранить основной ущерб?
Спасибо,
Не могли бы вы также добавить файл app.js? Кроме того, почему у вас есть три файла ошибок в вашем представлении вместо одного? Наконец, вы должны использовать этот «ответ» в своем router.post, чтобы отвечать новыми данными или отображать представление пользователю после выполнения действия сохранения. –
Почему бы не принять сообщение об ошибке по номиналу? Не найти ресурс не найти ресурс. – user2864740
@ user2864740, я понимаю, что ресурс не найден. Я пытаюсь выяснить, почему он не находит «ошибку», когда ему сказали искать «html», и есть view/error.html. – JonathanHayward