Как я могу использовать ПО промежуточного слоя Express.js в проекте Keystone.js?

В настоящее время я создаю проект Keystone.js, и мне нужно использовать некоторые Express.js библиотеки промежуточного программного обеспечения. Поскольку Keystone.js построен поверх Express.js, казалось, что это будет довольно просто, но я сталкиваюсь с множеством проблем, пока все работает.

Вот что я сейчас пытаюсь (это мое лучшее предположение относительно правильного способа сделать это):

В моем файле keystone.js (основная точка входа в приложение) я вставляю следующий код непосредственно перед keystone.start():

keystone.app.use(stormpath.init(keystone.app, {
  ...
}));

Здесь важен бит keystone.app.use(...);. Я просмотрел исходный код Keystone.js, и оказалось, что базовый объект приложения Express.js представлен как keystone.app, поэтому я пытаюсь использовать его таким образом.

К сожалению, хотя мой веб-сервер Keystone запускается при запуске $ node keystone.js, попытка загрузить любую страницу на моем сайте приводит к следующему исключению:

$ node keystone.js

------------------------------------------------
KeystoneJS Started:
keystone is ready on port 3000
------------------------------------------------

TypeError: Object #<Object> has no method 'regenerate'
    at doSignin (/Users/rdegges/Dropbox/Code/testing/keystone/node_modules/keystone/lib/session.js:38:15)
    at Promise.<anonymous> (/Users/rdegges/Dropbox/Code/testing/keystone/node_modules/keystone/lib/session.js:72:5)
    at Promise.<anonymous> (/Users/rdegges/Dropbox/Code/testing/keystone/node_modules/keystone/node_modules/mongoose/node_modules/mpromise/lib/promise.js:177:8)
    at Promise.EventEmitter.emit (events.js:95:17)
    at Promise.emit (/Users/rdegges/Dropbox/Code/testing/keystone/node_modules/keystone/node_modules/mongoose/node_modules/mpromise/lib/promise.js:84:38)
    at Promise.fulfill (/Users/rdegges/Dropbox/Code/testing/keystone/node_modules/keystone/node_modules/mongoose/node_modules/mpromise/lib/promise.js:97:20)
    at Promise.resolve (/Users/rdegges/Dropbox/Code/testing/keystone/node_modules/keystone/node_modules/mongoose/lib/promise.js:114:23)
    at Promise.<anonymous> (/Users/rdegges/Dropbox/Code/testing/keystone/node_modules/keystone/node_modules/mongoose/node_modules/mpromise/lib/promise.js:177:8)
    at Promise.EventEmitter.emit (events.js:95:17)
    at Promise.emit (/Users/rdegges/Dropbox/Code/testing/keystone/node_modules/keystone/node_modules/mongoose/node_modules/mpromise/lib/promise.js:84:38)
    at Promise.fulfill (/Users/rdegges/Dropbox/Code/testing/keystone/node_modules/keystone/node_modules/mongoose/node_modules/mpromise/lib/promise.js:97:20)
    at /Users/rdegges/Dropbox/Code/testing/keystone/node_modules/keystone/node_modules/mongoose/lib/query.js:1400:13
    at model.Document.init (/Users/rdegges/Dropbox/Code/testing/keystone/node_modules/keystone/node_modules/mongoose/lib/document.js:250:11)
    at completeOne (/Users/rdegges/Dropbox/Code/testing/keystone/node_modules/keystone/node_modules/mongoose/lib/query.js:1398:10)
    at Object.cb (/Users/rdegges/Dropbox/Code/testing/keystone/node_modules/keystone/node_modules/mongoose/lib/query.js:1155:11)
    at Object._onImmediate (/Users/rdegges/Dropbox/Code/testing/keystone/node_modules/keystone/node_modules/mongoose/node_modules/mquery/lib/utils.js:137:16)

У меня MongoDB отлично работает локально, и если я прокомментирую свой код выше, все будет работать, как и ожидалось, поэтому я знаю, что это основная причина.

Любая помощь будет оценена по достоинству.


person rdegges    schedule 23.02.2015    source источник
comment
Когда вы говорите о попытке загрузить любую страницу на моем сайте, вы имеете в виду маршруты Keystone (т.е. /keystone/*) или маршруты с вашего собственного сайта?   -  person JME    schedule 24.02.2015
comment
Забыл спросить, какую версию KeystoneJS вы используете?   -  person JME    schedule 24.02.2015
comment
Ах, я в основном открываю свой браузер и перехожу к localhost: 3000 - это то, что я имею в виду, когда пытаюсь загрузить любую страницу на моем сайте - извините за двусмысленность. Также: я использую keystone 0.3.0. Мой проект был сгенерирован генератором keystone yoman, так что это стандартная установка.   -  person rdegges    schedule 25.02.2015
comment
Последний вопрос, прежде чем я отправлю предложенный ответ. В какой момент в вашем сценарии запуска (я предполагаю, что keystone.js) вы поместили keystone.app.use(stormpath.init(...))? Можете ли вы поделиться своим файлом keystone.js?   -  person JME    schedule 25.02.2015
comment
Конечно: вот мой полный файл keystone.js: pastie.org/9981967 Я поместил его прямо над битом keystone.start() ( это казалось подходящим местом). Спасибо за столько времени/помощь!   -  person rdegges    schedule 25.02.2015
comment
Отлично... спасибо! Позвольте мне выполнить некоторые действия по устранению неполадок, чтобы увидеть, смогу ли я найти проблему для вас.   -  person JME    schedule 26.02.2015
comment
Вы нашли решение по этому поводу. Я застрял в той же проблеме   -  person Naeem Shaikh    schedule 23.04.2015
comment
@JME.. я хочу, чтобы маршруты Keystone (i.e. /keystone/*) имели собственное промежуточное ПО для аутентификации..   -  person Naeem Shaikh    schedule 23.04.2015


Ответы (1)


Вы можете передать уже существующий экспресс-экземпляр в keystone, прежде чем инициализировать keystone с помощью объекта «приложение» в keystone. О чем можно прочитать здесь:

http://keystonejs.com/docs/configuration/#options-concepts

EDIT* из комментариев к обновленным документам:

https://keystonejs.com/documentation/configuration/project-options

Есть даже немного дополнительного текста, описывающего, как передать в вашем собственном экземпляре Express и как он изменился в более новых версиях Express.

var express = require('express'),
app = express(),
keystone = require('keystone'),
serve = require('serve-static'),
favicon = require('serve-favicon'),
body = require('body-parser'),
cookieParser = require('cookie-parser'),
multer = require('multer');

var cookieSecret = 'secretCookie'

//Add your middleware
app.use(cookieParser(cookieSecret));
app.use(body.urlencoded({ extended: true }));
app.use(body.json());
app.use(multer());
keystone.init({
  'name': 'Website Name',
  'brand': 'Website Brand',
  'session': false,
  'updates': 'updates',
  'auth': true,
  'user model': 'User',
  'auto update': true,
  'cookie secret': cookieSecret
});

// Let keystone know where your models are defined. Here we have it at the `/models`
keystone.import('models');

// Serve your static assets
app.use(serve('./public'));

// This is where your normal routes and files are handled
app.get('/', function(req, res, next) {
  res.send('hello world');
});
keystone.app = app;
keystone.start();

Затем keystone будет использовать ваш экземпляр экспресса, что позволит вам добавить все промежуточное ПО, как если бы оно было экспрессом само по себе, прежде чем вы инициализируете keystone.

person Jeremy Hindle    schedule 05.12.2015
comment
Страница документации Keystone, в которой упоминается перезапись экспресс-приложения по умолчанию, — это параметры проекта. - person Dylan Landry; 26.11.2018
comment
Спасибо @DylanLandry - я знаю, что уже поздно, но я обновлю ответ. Я предполагаю, что они, вероятно, обновили свои документы. - person Jeremy Hindle; 09.02.2019