TypeScript+REST API项目编译错误排查与解决求助
TypeScript音频特征提取REST API编译错误修复
错误根源总结
- 导入语法错误:
import * from "fs"不符合TypeScript导入规范 - CommonJS模块兼容性:express、formidable等模块使用
export =导出方式,默认导入需开启esModuleInterop编译选项 - 类型误用:
IncomingForm是运行时值而非类型,作为类型标注时需使用typeof IncomingForm或模块内置类型
修复步骤
1. 配置TypeScript编译选项(添加/修改tsconfig.json)
若项目无tsconfig.json,在根目录创建该文件并添加以下配置:
{ "compilerOptions": { "target": "ES2020", "module": "CommonJS", "outDir": "./dist", "rootDir": "./", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true }, "include": ["server.ts"] }
关键配置说明:
esModuleInterop: 解决CommonJS模块默认导入的编译错误target: 匹配Node.js支持的ES版本,避免语法兼容问题
2. 修正代码中的导入与类型问题
对server.ts做以下针对性修改:
- 修正
fs导入语法,改为标准的整体导入 - 统一formidable的导入方式,直接使用模块内置类型
- 修正
IncomingForm的类型标注错误 - 完善错误处理逻辑,避免未捕获异常
最终可运行代码
import express, { NextFunction } from "express"; import formidable, { Fields, Files, File } from "formidable"; import * as fs from "fs"; import { IncomingMessage } from "http"; import { Essentia, EssentiaWASM } from "essentia.js"; import decode from "audio-decode"; const app = express(); const port = 3000; const essentia = new Essentia(EssentiaWASM); const KEYS = ["C", "D", "E", "F", "G", "A", "B"]; app.use(express.json()); app.use(express.urlencoded({ extended: true })); const parseForm = async ( form: formidable.IncomingForm, req: IncomingMessage, next: NextFunction ): Promise<{ fields: Fields; files: Files }> => { return await new Promise((resolve, reject) => { form.parse( req, function (err: Error | null, fields: Fields, files: Files) { if (err) return reject(err); resolve({ fields, files }); } ); }); }; const decodeAudio = async (filepath: string) => { const buffer = fs.readFileSync(filepath); const audio = await decode(buffer); const audioVector = essentia.arrayToVector(audio._channelData[0]); return audioVector; }; app.post("/upload", async (req, res, next) => { try { const form = formidable(); const { files } = await parseForm(form, req, next); // 上传的文件必须具有字段名"file" const file = files.file as File; const data = await decodeAudio(file.filepath); const danceability = essentia.Danceability(data).danceability; const duration = essentia.Duration(data).duration; const energy = essentia.Energy(data).energy; const computedKey = essentia.KeyExtractor(data); const key = KEYS.indexOf(computedKey.key); const mode = computedKey.scale === "major" ? 1 : 0; const loudness = essentia.DynamicComplexity(data).loudness; const tempo = essentia.PercivalBpmEstimator(data).bpm; res.status(200).json({ danceability, duration, energy, key, mode, loudness, tempo, }); } catch (err) { next(err); } }); app.listen(port, () => { console.log(`Express server listening at http://localhost:${port}`); });
运行验证
- 安装依赖:
npm install express formidable essentia.js audio-decode @types/express @types/formidable @types/node - 编译代码:
npx tsc - 启动服务:
node dist/server.js
内容的提问来源于stack exchange,提问作者Jan Giachin
相关产品推荐
相关产品推荐

