2015-02-23 49 views
4

我目前正在构建一个Keystone.js项目,并且需要使用一些Express.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,这是为什么我试图以这种方式使用它。

不幸的是,而我的梯形的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的本地运行得很好,如果我注释掉我的代码上面的东西按预期工作,所以我知道这是根本原因。

任何帮助,将不胜感激。

+0

当你说“试图在我的网站上加载任何页面”时,你的意思是Keystone路由(即'/ keystone/*')还是来自你自己站点的路由? – JME 2015-02-23 23:51:37

+0

忘记了问,您使用的是什么版本的KeystoneJS? – JME 2015-02-24 00:24:45

+0

嗯,我基本上打开我的浏览器并导航到本地主机:3000 - 这就是我的意思*试图加载我的网站上的任何页面* - 抱歉的歧义。另外:我使用的是keystone 0.3.0。我的项目是由keystone yeoman生成器生成的,所以它是股票安装。 – rdegges 2015-02-25 00:29:19

回答

-5

你试过强制安装依赖关系吗?

npm install -g

2

您初始化使用梯形校正的“应用程序”对象梯形之前,您可以通过已经存在的Express实例为基石。你可以读到这里:描述如何在自己的Express实例通过文字

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

的Theres甚至一些额外位和它如何与快递的新版本改变。

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

然后梯形将使用您的明确,这将允许你添加所有的中间件,就好像它是表达自身已经初始化梯形前的实例。