[英]How to annotate Express middlewares with JSDoc?
我正在尝试记录 Express 中间件,但 WebStorm 中的内置验证工具告诉我,以下 JSDoc 块中的类型分配不正确:
/**
* My middleware.
*
* @param {Object} req
* @param {Object} res
* @param {Function} next
* @return {Object}
*/
exports.show = function(req, res, next) {
...
};
在 Express 源代码中,我没有找到任何@typedef
来帮助我。 另外,我想避免诸如@param {*}
类的东西。
使用 JSDoc 记录 Express 中间件的正确方法是什么? 谢谢你的帮助。
npm install --save-dev @types/express
@param {e.Response} res
/node_modules/@types/express/index.d.ts
... declare namespace e { ... export interface Response extends core.Response { } ...
通过设置 > 语言和框架 > Javascript > 库 > @types/express 安装类型
您可以使用以下方法记录您的中间件
const express = require("express");
/**
* @param {express.Request} req
* @param {express.Response} res
* @param {express.NextFunction} next
*/
function (req, res, next) {}
当您有向 req 添加属性的中间件时,您还可以添加它们
const express = require("express");
/**
* @param {express.Request & {specialParam1 : string, specialParam2 : any}} req
* @param {express.Response} res
* @param {express.NextFunction} next
*/
function (req, res, next) {}
或者事件更好,为“req”上添加的每个新元素源创建一个typedef,并使用“&”创建一个将它们组合在一起的类型。
首先,我们同意中间件是函数; 通常不保证特殊类型声明。 除此之外,中间件往往是高度解耦的——模块化——这意味着@module
标签通常是适用的(这在你运行 jsdoc 时会产生很好的结果)。
/**
* Description of my middleware.
* @module myMiddleware
* @function
* @param {Object} req - Express request object
* @param {Object} res - Express response object
* @param {Function} next - Express next middleware function
* @return {undefined}
*/
返回标记是可选的,具体取决于您的样式指南,因为中间件不返回值。 最后,与 Nick 和 mmm 声称的相反, next
参数是一个函数。
http://expressjs.com/en/guide/using-middleware.html
中间件函数是可以访问请求对象 (req)、响应对象 (res) 和应用程序请求-响应循环中的下一个中间件函数的函数。 next 中间件函数通常由名为 next 的变量表示。
next
不是花哨的 Express 内部混合物; Express 向每个中间件函数传递请求、响应和堆栈中的下一个中间件函数,如下所示:
mw1 = function(req, res, next){}.bind(undefined, req, res, mw2)
mw2 = function(req, res, next){}.bind(undefined, req, res, mw3)
的值next
的范围内mw1
是mw2
。
您不仅可以在 JsDoc 中获取参数类型和描述,还可以获取它们的预期成员。
/**
*
* @module myMiddleware
* @function
* @param req {Object} The request.
* @param res {Object} The response.
* @param req.params.foo {String} The foo param.
* @param req.query.bar {String} The bar query.
* @param req.body {Object} The JSON payload.
* @param {Function} next
* @return {undefined}
*/
function foo(req, res, next){
}
req
、 res
和next
都是对象,中间件通常不会返回,因此可能会使用以下内容。
/**
* My Middleware
* @name MyMiddleWare
* @function
* @param {Object} req
* @param {Object} res
* @param {Object} next
*/
[2021-03-02 更新] 原来的答案是 100% JSDOC + 0% typescript,但是我找到了一个 20% JSDOC + 80% typescript(纯定义)的解决方案。 在typescript github 中,它提到了这种方法。 请参阅帖子中的最后一段。
我结合其他答案并修改了一些代码,
它可以包括在express.Request
和事件自定义请求正文中定义的所有方法/属性。
它不仅可以在request.body
使用,还可以在req.query
。
那是因为express.Request
支持泛型,所以我们可以在 JSDoc 中使用它。
首先,记住安装@types/express
与npm install --save-dev @types/express
。
其次,设置如下代码。
// @ts-check
/**
* @typedef {object} showRequestBody
* @property {string} name this is name in request body
* @property {number} age this is age in request body
*
* @typedef {object} showRequestQuery
* @property {string} name this is name in query
* @property {number} age this is age in query
*
* @param {import('express').Request<{}, {}, showRequestBody, showRequestQuery>} req
* @param {import('express').Response} res
* @param {import('express').NextFunction} next
*/
exports.show = function(req, res, next) {
};
注意:我在 vscode 中使用它。
我在这里留下答案,我希望这会帮助其他人也有这个问题。
express.Request
定义的其他方法/属性,例如req.headers
req.body
提示
req.query
提示
以下示例不需要tsconfig.json
或安装额外的tsc
。
但是,您不能使用 jsdoc 来生成文档。
如果要通过导入某个模块来扩展接口,则需要在定义中使用 export。 然后在JSDOC中导入。
如果你不想在 JSDOC 中导入自定义定义,你可以只定义接口,而不需要导入和导出。 然后就可以直接在JSDOC中使用了。
还有另一种构建自定义接口的方法,只需使用declare模块扩展接口即可。 您甚至可以定义自定义方法。
您唯一需要更改的是@param {Object}
旁边的@param {Function}
@param {Object}
。 另外, @return
应该描述函数返回的内容; 例如, (Object, Array)
或组合({Object|Null})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.