You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}`);
});

运行验证

  1. 安装依赖:npm install express formidable essentia.js audio-decode @types/express @types/formidable @types/node
  2. 编译代码:npx tsc
  3. 启动服务:node dist/server.js

内容的提问来源于stack exchange,提问作者Jan Giachin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:35:37