首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NestJS/Express错误[ERR_HTTP_HEADERS_SENT]:无法在标头发送到客户端后设置它们

NestJS/Express错误[ERR_HTTP_HEADERS_SENT]:无法在标头发送到客户端后设置它们
EN

Stack Overflow用户
提问于 2022-11-29 17:58:01
回答 1查看 29关注 0票数 0

有时,我的服务器(NestJS)会使用以下堆栈崩溃:

代码语言:javascript
运行
复制
node:internal/errors:464
    ErrorCaptureStackTrace(err);
    ^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:371:5)
    at ServerResponse.setHeader (node:_http_outgoing:576:11)
    at ServerResponse.header (/home/workspace/node_modules/express/lib/response.js:771:10)
    at ServerResponse.send (/home/workspace/node_modules/express/lib/response.js:170:12)
    at ServerResponse.json (/home/workspace/node_modules/express/lib/response.js:267:15)
    at ExpressAdapter.reply (/home/workspace/node_modules/@nestjs/platform-express/adapters/express-adapter.js:24:57)
    at ExceptionsHandler.handleUnknownError (/home/workspace/node_modules/@nestjs/core/exceptions/base-exception-filter.js:33:24)
    at ExceptionsHandler.catch (/home/workspace/node_modules/@nestjs/core/exceptions/base-exception-filter.js:17:25)
    at ExceptionsHandler.next (/home/workspace/node_modules/@nestjs/core/exceptions/exceptions-handler.js:16:20)
    at /home/workspace/node_modules/@nestjs/core/router/router-proxy.js:24:35
    at Layer.handle_error (/home/workspace/node_modules/express/lib/router/layer.js:71:5)
    at trim_prefix (/home/workspace/node_modules/express/lib/router/index.js:315:13)
    at /home/workspace/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/home/workspace/node_modules/express/lib/router/index.js:335:12)
    at next (/home/workspace/node_modules/express/lib/router/index.js:275:10)
    at Layer.handle_error (/home/workspace/node_modules/express/lib/router/layer.js:67:12) {
  code: 'ERR_HTTP_HEADERS_SENT'
}

我试图用我在类似的网站上看到的一些建议来修复它(比如herehere),但它还是会发生。

使用的依赖关系:

代码语言:javascript
运行
复制
"@nestjs/common": "^7.6.12",
"@nestjs/config": "^0.6.3",
"@nestjs/core": "^7.6.12",
"@nestjs/jwt": "^7.2.0",
"@nestjs/mongoose": "^7.2.3",
"@nestjs/passport": "^7.1.5",
"@nestjs/platform-express": "^7.6.12",
"@nestjs/platform-socket.io": "^7.6.12",
"@nestjs/platform-ws": "^7.6.12",
"@nestjs/schedule": "^0.4.3",
"@nestjs/websockets": "^7.6.12",
"@types/string-similarity": "^4.0.0",
"bcrypt": "^5.0.1",
"class-transformer": "^0.2.3",
"class-validator": "^0.11.1",
"dotenv": "^10.0.0",
"express-useragent": "^1.0.15",
"mongodb": "^3.5.5",
"mongoose": "^5.9.7",
"nanoid": "^3.1.12",
"nestjs-i18n": "^8.1.0",
"nestjs-stripe": "^0.4.1",
"nodemailer": "^6.4.6",
"passport": "^0.4.1",
"passport-jwt": "^4.0.0",
"passport-local": "^1.0.0",
"path": "^0.12.7",
"reflect-metadata": "^0.1.13",
"rimraf": "^3.0.0",
"rxjs": "^6.5.3",
"string-similarity": "^4.0.4",
"stripe": "^8.39.0",
"typeorm": "^0.2.24"

可能有问题的代码:

AppController

代码语言:javascript
运行
复制
@Controller()
export class AppController {

    @Get()
    root(@Res() response): void {
        return response.sendFile(path.resolve(__dirname+'/../gui/index.html'));
    }

}

AppMiddleware

代码语言:javascript
运行
复制
@Injectable()
export class AppMiddleware implements NestMiddleware {

    use(req: Request, res: Response, next: Function) {
        const url = req.originalUrl;
        if (url.indexOf('api') === 1) {
            // it starts with /api --> continue with execution
            return next();
        } else if (allowedExt.filter(ext => url.indexOf(ext) > 0).length > 0) {
            // it has a file extension --> resolve the file
            return res.sendFile(path.resolve(__dirname + `/../gui/${url}`), err => {
                // Error: redirect to index.html
                if (err) {
                    return res.sendFile(path.resolve(__dirname + '/../gui/index.html'));
                }
            });
        } else {
            // in all other cases, redirect to the index.html
            return res.sendFile(path.resolve(__dirname + '/../gui/index.html'));
        }
    }

}

我也试过,但没有回音:

代码语言:javascript
运行
复制
@Injectable()
export class AppMiddleware implements NestMiddleware {

    use(req: Request, res: Response, next: Function) {
        const url = req.originalUrl;
        if (url.indexOf('api') === 1) {
            // it starts with /api --> continue with execution
            next();
        } else if (allowedExt.filter(ext => url.indexOf(ext) > 0).length > 0) {
            // it has a file extension --> resolve the file
            res.sendFile(path.resolve(__dirname + `/../gui/${url}`), err => {
                // Error: redirect to index.html
                if (err) {
                    res.sendFile(path.resolve(__dirname + '/../gui/index.html'));
                }
            });
        } else {
            // in all other cases, redirect to the index.html
            res.sendFile(path.resolve(__dirname + '/../gui/index.html'));
        }
    }

}
EN

Stack Overflow用户

发布于 2022-11-30 05:02:23

在你的AppMiddleware

代码语言:javascript
运行
复制
return res.sendFile(path.resolve(__dirname + `/../gui/${url}`), err => {
    // Error: redirect to index.html
    if (err) {
        return res.sendFile(path.resolve(__dirname + '/../gui/index.html'));
    }
});

这可能就是原因。即使在出现错误时,您的response也在sendFile之后结束,因此不应该在回调中调用它。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74618332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档