2015-02-23 47 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(); 

然後梯形將使用您的明確,這將允許你添加所有的中間件,就好像它是表達自身已經初始化梯形前的實例。