【发布时间】:2021-05-14 10:16:24
【问题描述】:
我用 nodejs 和 express 构建了一个 web api。我使用 tsoa 生成我的路线和一个 swagger.json 文件。 我希望能够通过招摇登陆页面上传文件。我按照此页面上的说明进行操作:https://tsoa-community.github.io/docs/file-upload.html
我的 tsoa.json 看起来像这样:
{
"entryFile": "src/app.ts",
"noImplicitAdditionalProperties": "throw-on-extras",
"controllerPathGlobs": [
"src/**/*.controller.ts"
],
"spec": {
"basePath" : "/",
"description": "",
"outputDirectory": "dist/api/public",
"specVersion": 3,
"specMerging": "recursive",
"paths": {
"/admin/commands/create": {
"post": {
"consumes": [
"multipart/form-data"
],
"parameters": [
{
"in": "formData",
"name": "randomFileIsHere",
"required": true,
"type": "file"
}
]
}
}
}
},
"routes": {
"routesDir": "src/api"
}
}
我的控制器:
@Tags("Admin Commands")
@Route("admin/commands")
export class AdminCommandController extends Controller
{
@Post('create')
public async CreateCommand(@Request() request: express.Request): Promise<void>
{
try{
await this.handleFile(request);
}
catch {
throw new Error("Error uploading file.");
}
console.log("No error");
}
private handleFile(request: express.Request): Promise<any> {
const multerSingle = multer().single("randomFileIsHere");
return new Promise((resolve, reject) => {
multerSingle(request, undefined, async (error: Error) => {
if (error) {
reject("error");
}
resolve("file will be in request.randomFileIsHere");
});
});
}
}
但是当我使用 tsoa swagger 命令生成 swagger.json 时,multipart/form-data 不会添加到我的 swagger.json 中。如果我手动将 multipart/form-data 添加到我的 swagger.json 中,我的 swagger 登陆页面上的输入字段是文本字段而不是文件字段。
"paths": {
"/admin/commands/create": {
"post": {
"operationId": "CreateCommand",
"consumes": [
"multipart/form-data"
],
"parameters": [
{
"in": "formData",
"name": "randomFileIsHere",
"required": true,
"type": "file"
}
],
"responses": {
"204": {
"description": "No content"
}
},
"tags": [
"Admin Commands"
],
"security": []
}
}
}
我错过了什么或做错了什么?此外,如果这可行,我如何从请求中提取文件。文档说该文件将被添加到请求对象的 randomFileIsHere 属性中,但如果我调用 request.randomFileIsHere 它显然会抛出一个错误。
【问题讨论】:
标签: node.js express file-upload swagger tsoa