Невозможно прочитать свойство «on» неопределенного: ошибка в Keystone.js

Я следил за руководством по адресу https://leanpub.com/keystonejs/read и пытался установить создать базовый веб-сайт.

Для этого хотел построить маршрут для / с файлом представления index.js и шаблоном в `index.twig'

Ниже приведена структура каталогов

routes/
|-- index.js
|-- middleware.js
`-- views
    |-- blog.js
    |-- contact.js
    |-- gallery.js
    |-- index.js
    `-- post.js
templates/
|-- layouts
|   `-- default.twig
|-- mixins
|   `-- flash-messages.twig
`-- views
    |-- assets -> public/assets/
    |-- blog.twig
    |-- contact.twig
    |-- errors
    |   |-- 404.twig
    |   `-- 500.twig
    |-- gallery.twig
    |-- index.html -> templates/views/index.twig
    |-- index.twig
    |-- post.twig
models/
|-- Audience.js
|-- Element.js
|-- Enquiry.js
|-- Gallery.js
|-- Guide.js
|-- Post.js
|-- PostCategory.js
|-- Section.js
|-- Subsection.js
`-- User.js

Ниже приведены мои файлы keystone.js, routes/index.js и routes/views/index.js.

    // Simulate config options from your production environment by
// customising the .env file in your project's root folder.
require('dotenv').config();

// Require keystone
var keystone = require('keystone');
var Twig = require('twig');

// Initialise Keystone with your project's configuration.
// See http://keystonejs.com/guide/config for available options
// and documentation.

keystone.init({
    'name': 'Bodhini',
    'brand': 'Bodhini',

    'less': 'public',
    'static': 'public',
    'favicon': 'public/favicon.ico',
    'views': 'templates/views',
    'view engine': 'twig',

    'twig options': { method: 'fs' },
    'custom engine': Twig.render,

    'auto update': true,
    'session': true,
    'auth': true,
    'user model': 'User',
});

// Load your project's Models
keystone.import('models');

// Setup common locals for your templates. The following are required for the
// bundled templates and layouts. Any runtime locals (that should be set uniquely
// for each request) should be added to ./routes/middleware.js
keystone.set('locals', {
    _: require('lodash'),
    env: keystone.get('env'),
    utils: keystone.utils,
    editable: keystone.content.editable,
});

    // Load your project's Routes
    keystone.set('routes', require('./routes'));


    // Configure the navigation bar in Keystone's Admin UI
    keystone.set('nav', {
    posts: ['posts', 'post-categories'],
    galleries: 'galleries',
    enquiries: 'enquiries',
    users: 'users',
    Guide: ['guides','sections','subsections','audiences'],
    element:'elements',});
    // Start Keystone to connect to your database and initialise the web server

маршруты/index.js

var keystone = require('keystone');
var middleware = require('./middleware');
var importRoutes = keystone.importer(__dirname);

// Common Middleware
keystone.pre('routes', middleware.initLocals);
keystone.pre('render', middleware.flashMessages);

// Import Route Controllers
var routes = {
    views: importRoutes('./views'),
};

// Setup Route Bindings
exports = module.exports = function (app) {
    // Views
    app.get('/', routes.views.index);
    app.get('/blog/:category?', routes.views.blog);
    app.get('/blog/post/:post', routes.views.post);
    app.get('/gallery', routes.views.gallery);
    app.all('/contact', routes.views.contact);

    // NOTE: To protect a route so that only admins can see it, use the requireUser middleware:
    // app.get('/protected', middleware.requireUser, routes.views.protected);

};

маршруты/представления/index.js

var keystone = require('keystone');

exports = module.exports = function(req, res){
    var view = keystone.View(req, res);
    var locals = res.locals;

    locals.data={
        story:{},
        work:{},
        why:{},
        disclaimer:{},
    };


    view.on('init', function(next){
    var q = kestone.list('Element').model.findOne({slug: 'story'});
        q.exec(function(err, result){
        locals.data.story = result;
            next(err);

        });

    });

    view.render('index');

Пока я запускаю node keystone, а затем пытаюсь открыть путь / в браузере, я получаю ошибку 404 вместе с этим выводом.

------------------------------------------------
KeystoneJS Started:
Bodhini is ready on http://0.0.0.0:3000
------------------------------------------------

Error thrown for request: /
TypeError: Cannot read property 'on' of undefined
    at module.exports (/home/auditor/Sites/Bodhini/routes/views/index.js:35:9)
    at Layer.handle [as handle_request] (/home/auditor/Sites/Bodhini/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/auditor/Sites/Bodhini/node_modules/express/lib/router/route.js:131:13)
    at Route.dispatch (/home/auditor/Sites/Bodhini/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/home/auditor/Sites/Bodhini/node_modules/express/lib/router/layer.js:95:5)
    at /home/auditor/Sites/Bodhini/node_modules/express/lib/router/index.js:277:22
    at Function.process_params (/home/auditor/Sites/Bodhini/node_modules/express/lib/router/index.js:330:12)
    at next (/home/auditor/Sites/Bodhini/node_modules/express/lib/router/index.js:271:10)
    at /home/auditor/Sites/Bodhini/node_modules/grappling-hook/index.js:198:10
    at _combinedTickCallback (internal/process/next_tick.js:95:7)
    at process._tickCallback (internal/process/next_tick.js:161:9)
GET / 500 16.644 ms

Пожалуйста, помогите мне, как это исправить. Я новичок в node.js и экспресс/краеугольном камне


person BMC    schedule 17.07.2017    source источник


Ответы (1)


var view = keystone.View(req, res);

должно быть

var view = new keystone.View(req, res);

так как это конструктор. Документация Keystone

person Joe    schedule 17.07.2017
comment
@BMC, пожалуйста, не забудьте принять ответ, если вы нашли его полезным, чтобы вы оба могли получить небольшую репутацию. - person scniro; 18.07.2017