我目前正在构建一个 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 在本地正常运行,如果我在上面注释掉我的代码,一切都会按预期工作,所以我知道这是根本原因。
如有任何帮助,我们将不胜感激。
最佳答案
在使用 keystone 上的“app”对象初始化 keystone 之前,您可以将已经存在的 express 实例传递到 keystone。您可以在这里阅读:
http://keystonejs.com/docs/configuration/#options-concepts
编辑*更新文档的评论:
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 一样。
关于javascript - 如何在 Keystone.js 项目中使用 Express.js 中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28685092/