我正在开发一个基于express的节点服务器,它是用TypeScript 1.7编写的。我正在使用一些特定于项目的中间件,这些中间件扩展了现有的express请求或响应接口,但我还无法使其完全工作(tsc抱怨在req
或
res
中找不到X)。我发现了关于这个问题的其他问题,但它们要么已经过时(我想),要么解决方案不直接。
我查看了现有中间件的定义,但如果不手动编写单独的d.ts文件并在typings/tsd中引用它们,我就无法使其工作。d、 ts.这是我的设置:
// middleware/foobar.ts
declare module Express {
export interface Request {
foobar?: string;
}
}
/* my project-related middleware extends the request by `foobar` */
export = function(req: Express.Request, res, next) {
req.foobar = 'FooBar';
next();
};
// main.ts
import express = require('express');
var app = express();
app.use(require('./middleware/foobar'));
app.get('/foobar', (req, res) => {
/* tsc: Property 'foobar' does not exist on type 'Request' */
res.send(req.foobar);
});
扩展express的请求和响应接口的最佳实践是什么?如果可能的话,不需要编写单独的d.T,操作typings目录中的任何内容或使用
///
我自己找到了一个解决方案,用这个例子作为参考。我的中间件需要包装在一个声明的模块中,所以中间件/foobar.ts看起来像这样:
declare module Express {
export interface Request {
foobar?: string;
}
}
declare module 'foobar' {
function foobar(req: Express.Request, res, next) {
req.foobar = 'FooBar';
next();
}
export = foobar;
}
如果您在中间件中使用类或其他导入的东西,那么就更加复杂了。在我的示例中,我的中间件使用我自己的“EntityManager”类,这是对数据库连接的抽象(对我来说是mysql)。我的中间件(对我来说是中间件/数据库。ts)现在看起来像这样:
declare module Express {
import { Manager as EntityManager } from 'entity-manager';
export interface Request {
entityManager?: EntityManager;
}
}
declare module 'database' {
import * as mysql from 'mysql';
import { Manager as EntityManager } from 'entity-manager';
/* some middleware-related code */
var pool = mysql.createPool(...);
var entityManager = new EntityManager(pool);
/* *** */
/* the actual exported function */
function database(req: Express.Request, res, next) {
req.entityManager = entityManager;
next();
};
export = database;
}
注意,我的EntityManager类被导入了两次,每个模块声明一次。仅仅在两个模块上导入它似乎不起作用。
更新
将实际代码放在声明的模块中(在我的例子中是“数据库”)不会在JS文件中产生任何输出。
在常规模块中包含该代码需要名称不使用撇号(例如,此处不允许使用连字符),并且也不会生成单函数导出代码。
将实际代码完全从模块中取出(因此只有带有扩展请求的声明的Express模块)可以生成正确的JS,但我的文本编辑器在req中再也找不到entityManager。
似乎我需要将打字(例如我自己的扩展名来表示请求)放入一个专用的d.ts文件中,在这个文件中没有实际的代码。
这个问题已经被问了好几次了,但没有一个答案对我有效。我试图扩展Express请求对象,使其包含一个属性来存储用户对象。我创建了一个声明文件,
Express middleware The Express middleware modules listed here are maintained by the Expressjs team. Middleware module Description Replaces built-in function (Express 3) body-parser Parse HTTP request
问题内容: 我在我的应用程序中使用了express以及body-parser。 但是,express 4.0中的“扩展”是什么意思? 我找到了这个 但是,我仍然不能理解它的含义。 问题答案: 如果为,则不能发布“嵌套对象” 如果为,则可以按照自己喜欢的方式进行操作。
我安装laravel通过作曲家,但当运行的网站它给一个错误 我也安装了php5-mcrypt,但错误仍然存在。
问题内容: 我正在尝试添加一个属性以使用Typescript从中间件表达请求对象。但是我不知道如何向对象添加额外的属性。如果可能的话,我宁愿不使用括号符号。 我正在寻找一种解决方案,允许我编写与此类似的内容(如果可能): 问题答案: 您想要创建一个自定义定义,并在Typescript中使用一个称为声明合并的功能。这是常用的,例如在中。 创建一个文件,并确保将其包含在您的-部分中(如果有)。内容如下
如果默认的调度器不满足要求,还可以部署自定义的调度器。并且,在整个集群中还可以同时运行多个调度器实例,通过 podSpec.schedulerName 来选择使用哪一个调度器(默认使用内置的调度器)。 开发自定义调度器 自定义调度器主要的功能是查询未调度的 Pod,按照自定义的调度策略选择新的 Node,并将其更新到 Pod 的 Node Binding 上。 比如,一个最简单的调度器可以用 sh