你能在 ExpressJS 应用程序中多次调用 "express()" 吗? (或者:"express()" 到底在做什么?)
Can you call "express()" more than once in an ExpressJS application? (Or: what exactly is "express()" doing?)
我已经使用 Express 一段时间了,但突然间我对一些非常基本的东西不确定 --
我正在尝试将自定义中间件添加到 KeystoneJS 应用程序——特别是我正在将 JWT 令牌端点添加到 TinyMCE 自定义字段
自定义字段是
export let Wysiwyg = {
type: 'Wysiwyg',
implementation: Text.implementation,
views: {
Controller: Text.views.Controller,
Field: importView('./views/Field'),
Filter: Text.views.Filter,
},
adapters: Text.adapters,
prepareMiddleware,
};
并且prepareMiddleware
是
function prepareMiddleware() {
const tinymcePath = dirname(require.resolve('tinymce'));
const app = express();
app.use(cors());
app.use('/tinymce-assets', express.static(tinymcePath));
app.post('/jwt', function (req, res) {
// NOTE: Before you proceed with the TOKEN, verify your users' session or access.
const payload = {
sub: '123', // Unique user id string
name: 'John Doe', // Full name of user
// Optional custom user root path
// 'https://claims.tiny.cloud/drive/root': '/johndoe',
exp: Math.floor(Date.now() / 1000) + (60 * 60) // 60 minutes expiration
};
try {
const token = jwt.sign(payload, privateKey, { algorithm: 'RS256'});
res.set('content-type', 'application/json');
res.status(200);
res.send(JSON.stringify({
token: token
}));
} catch (e) {
res.status(500);
res.send(e.message);
}
});
return app;
}
这都是从具有自己的 ExpressJS 服务器的 KeystoneJS 应用程序调用的 运行。上面对 express()
的调用到底是做什么的? ExpressJS API docs 说
**express()**
Creates an Express application. The express() function is a top-level function exported by the express module.
var express = require('express')
var app = express()
我一直认为这是在创建一个新的 HTTP 服务器。你肯定不想在一个应用程序中做两次,除非你在不同的端口上服务(我不想这样做)?
同样,KeystoneJS docs 说
If you need to provide your own custom middleware for your system you
can create a custom App and include it in your exported apps.
class CustomApp {
prepareMiddleware({ keystone, dev, distDir }) {
const middleware = express();
// ...
return middleware;
}
}
这里,他们再次调用 express()
。
当您调用express()
时究竟发生了什么?根据文档,它会启动一个新的 Express 应用程序,但我一直认为这等同于启动一个新服务器。当然,我想,你不能在同一个端口上启动两个服务器。
感谢您帮我解惑 -- 我显然只见树木不见森林。
express()
基本上只是创建了一堆中间件函数。它本身不是服务器。
因为它只是一堆中间件,一个 Express 应用程序可以 'mounted' 到另一个应用程序中。 An example is shown here(为简洁起见进行了编辑):
var sub2 = express();
sub2.get("/", (req, res) => { res.json({}); });
var app = express();
app.use("/foo", sub2);
定义和use()
创建一个新的 Express 实例实际上与加载任何其他中间件堆栈没有什么不同,例如express.Router()
。
至于绑定到端口,通常,您只会在最上面的 Express 应用程序实例上调用 listen()
辅助函数。这一切所做的只是设置一个基本的 HTTP 服务器(因此您不必这样做)并将您的 Express 实例注册为回调。这与 http.createServer(options, myUpperMostExpressApp);
.
没什么不同
我已经使用 Express 一段时间了,但突然间我对一些非常基本的东西不确定 --
我正在尝试将自定义中间件添加到 KeystoneJS 应用程序——特别是我正在将 JWT 令牌端点添加到 TinyMCE 自定义字段
自定义字段是
export let Wysiwyg = {
type: 'Wysiwyg',
implementation: Text.implementation,
views: {
Controller: Text.views.Controller,
Field: importView('./views/Field'),
Filter: Text.views.Filter,
},
adapters: Text.adapters,
prepareMiddleware,
};
并且prepareMiddleware
是
function prepareMiddleware() {
const tinymcePath = dirname(require.resolve('tinymce'));
const app = express();
app.use(cors());
app.use('/tinymce-assets', express.static(tinymcePath));
app.post('/jwt', function (req, res) {
// NOTE: Before you proceed with the TOKEN, verify your users' session or access.
const payload = {
sub: '123', // Unique user id string
name: 'John Doe', // Full name of user
// Optional custom user root path
// 'https://claims.tiny.cloud/drive/root': '/johndoe',
exp: Math.floor(Date.now() / 1000) + (60 * 60) // 60 minutes expiration
};
try {
const token = jwt.sign(payload, privateKey, { algorithm: 'RS256'});
res.set('content-type', 'application/json');
res.status(200);
res.send(JSON.stringify({
token: token
}));
} catch (e) {
res.status(500);
res.send(e.message);
}
});
return app;
}
这都是从具有自己的 ExpressJS 服务器的 KeystoneJS 应用程序调用的 运行。上面对 express()
的调用到底是做什么的? ExpressJS API docs 说
**express()**
Creates an Express application. The express() function is a top-level function exported by the express module.
var express = require('express')
var app = express()
我一直认为这是在创建一个新的 HTTP 服务器。你肯定不想在一个应用程序中做两次,除非你在不同的端口上服务(我不想这样做)?
同样,KeystoneJS docs 说
If you need to provide your own custom middleware for your system you can create a custom App and include it in your exported apps.
class CustomApp {
prepareMiddleware({ keystone, dev, distDir }) {
const middleware = express();
// ...
return middleware;
}
}
这里,他们再次调用 express()
。
当您调用express()
时究竟发生了什么?根据文档,它会启动一个新的 Express 应用程序,但我一直认为这等同于启动一个新服务器。当然,我想,你不能在同一个端口上启动两个服务器。
感谢您帮我解惑 -- 我显然只见树木不见森林。
express()
基本上只是创建了一堆中间件函数。它本身不是服务器。
因为它只是一堆中间件,一个 Express 应用程序可以 'mounted' 到另一个应用程序中。 An example is shown here(为简洁起见进行了编辑):
var sub2 = express();
sub2.get("/", (req, res) => { res.json({}); });
var app = express();
app.use("/foo", sub2);
定义和use()
创建一个新的 Express 实例实际上与加载任何其他中间件堆栈没有什么不同,例如express.Router()
。
至于绑定到端口,通常,您只会在最上面的 Express 应用程序实例上调用 listen()
辅助函数。这一切所做的只是设置一个基本的 HTTP 服务器(因此您不必这样做)并将您的 Express 实例注册为回调。这与 http.createServer(options, myUpperMostExpressApp);
.