4

我目前正在构建一个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 Web 服务器在运行时启动$ 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 在本地运行得很好,如果我在上面注释掉我的代码,事情会按预期工作,所以我知道这是根本原因。

任何帮助,将不胜感激。

4

1 回答 1

3

在使用 keystone 上的“app”对象初始化 keystone 之前,您可以将已经存在的 express 实例传递给 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 将使用您的 express 实例,这将允许您在初始化 keystone 之前添加所有中间件,就好像它本身就是 express 一样。

于 2015-12-05T11:05:37.720 回答