javascript - 如何在 Keystone.js 项目中使用 Express.js 中间件?

标签 javascript node.js express keystonejs

我目前正在构建一个 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/

相关文章:

javascript - JS - canvas.toDataURL 失败

javascript - 正则表达式和javascript

java - 为什么servlet重定向速度很快?

node.js - 如何对 freebusy google calendar nodejs api 进行故障排除?

node.js - 发送html页面给客户端

javascript - 如何在请求中操作 res.locals 对象?

javascript - '文件名仅在外壳中与已包含的文件名不同'在具有相同外壳的相对路径上

javascript - 如何在Sequelize中使用belongsToMany?

javascript - 如何对数组应用映射操作来添加属性?

javascript - 由 Express 服务器提供的 Webpack bundle - 找不到 bundle