Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
易混淆的express.Router()问题_Express_Serverless Framework - Fatal编程技术网

易混淆的express.Router()问题

易混淆的express.Router()问题,express,serverless-framework,Express,Serverless Framework,我使用NestJS构建了一个大型应用程序,我使用serverless框架部署它。我这样做已经有一段时间了,一切都很好。几天前,我不得不更新到nestjs7,当我的应用程序部署到aws时,我在引导应用程序时遇到了很多问题。在经历了无数次令人沮丧的尝试来解决这个问题之后,它看起来实际上与Nestjs/serverless引导过程毫无关系,apollo server express无法访问express路由器-错误导致失败: express\u 1.default.Router不是一个函数 最后我意识

我使用
NestJS
构建了一个大型应用程序,我使用
serverless框架部署它。我这样做已经有一段时间了,一切都很好。几天前,我不得不更新到
nestjs7
,当我的应用程序部署到
aws
时,我在引导应用程序时遇到了很多问题。在经历了无数次令人沮丧的尝试来解决这个问题之后,它看起来实际上与Nestjs/serverless引导过程毫无关系,
apollo server express
无法访问express路由器-错误导致失败:

express\u 1.default.Router不是一个函数

最后我意识到,当我直接导入
express
并尝试访问
express.Router()
时,我也遇到了同样的问题。所以我做了一个非常简单的测试:

lambda.ts:

import { Context, Handler } from "aws-lambda";
import express from "express";

export const handler: Handler = async (event: any, context: Context) => {
  console.log("Import express:", express);
  console.log("Test express app: ", express());
  console.log("Test router:", express.Router());

  /* express.Router() ->
  ERROR TypeError: express_1.default.Router is not a function at 
  /var/task/dist/lambda.js:19:51 at Generator.next (<anonymous>) at 
  /var/task/dist/lambda.js:8:71 at new Promise (<anonymous>) at 
  __awaiter (/var/task/dist/lambda.js:4:12) at exports.handler (/var/task/dist/lambda.js:16:39) at 
  Runtime.handler (/var/task/serverless_sdk/index.js:9:131872) at 
  Runtime.handleOnce (/var/runtime/Runtime.js:66:25)
  */
};
package.json:

{
  "name": "@xxx/XXXXXX",
  "version": "0.1.13",
  "dependencies": {
    "express": "4.17.1"
  },
  "devDependencies": {
    "serverless-deployment-bucket": "1.1.1",
    "serverless-prune-plugin": "1.4.2",
    "serverless-pseudo-parameters": "2.5.0",
    "ts-node": "^8.7.0",
    "tsconfig-paths": "^3.7.0",
    "tslint": "5.12.1",
    "tslint-config-prettier": "^1.18.0",
    "typescript": "^3.8.3"
  }
}
tsconfig.json:

{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "@root/*": ["src/*"]
    },
    "module": "commonjs",
    "moduleResolution": "node",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es6",
    "sourceMap": true,
    "outDir": "dist",
    "esModuleInterop": true
  },
  "include": ["*"],
  "exclude": ["**/node_modules/**/*", "dist"]
}
我想强调的是,这段代码只在部署到lambda时失败。它在本地运行良好,这表明打包过程可能出了问题,但zip文件包含正确的代码和依赖项

在把问题缩小到这个范围之前,我已经研究这个问题很多年了。如果有人能够解释以上的内容,我将不胜感激,因为这显然阻碍了我

非常感谢


更新:

好的,如果我:

从“express/lib/Router”导入路由器

然后我得到一个路由器实例。这与express索引应该导出的实例相同

所以我很接近,但这感觉不对,我没有改变任何东西,我感觉我有一些不正确的模块配置或其他东西

那么为什么我不能做
express.Router()
。任何想法都将不胜感激


更新:

最后,我修补了apollo server express
,以便它从lib/router获取路由器实例,然后一切都按预期工作

我显然不想这样做,所以我真的需要找出是什么导致了这一切

已修补的ApolloServer.js:


更新:

另一个相关问题是,标题作为响应主体的一部分返回,例如:

HTTP/1.1200OKX-Powered-By: ExpressAccess-Control-Allow-Origin: *Content-Type: application/json;charset=utf-8Content-Length: 155ETag: W/"9b-mbrRmusN4ADjvBFA5aFJNLyRMHs"Date: Sat,
04Apr202014: 35: 09GMTConnection: keep-alive{
  "data": {
    "memberLoginHook": {
      "id": "1bb4ca87-d9f6-4ccb-a2a4-0249b19699b3",
      "occupation": "C3PO",
      "positions": [
        {
          "id": "f4deaf82-ad87-472b-82ab-c78d08138526"
        }
      ]
    }
  }
}
同样值得注意的是,我发现其他人也有同样的问题:
我知道是什么触发了这个问题,非常奇怪的bug有非常奇怪的解决方案。 尝试禁用Serverless Framework Enterprise(如果已启用),您只需在Serverless.yml文件中注释租户和应用程序行,然后再次部署应用程序。
我认为最新版本的无服务器sdk中有一个bug。

很好的推论,这似乎是可行的,我甚至没有想到这一点。这确实解决了我的测试lambda中的问题。当我使用secrets manager处理阶段环境变量时,将自己与企业分离是一件痛苦的事情。我已在仪表板聊天中发送了一条消息。希望我们能尽快解决这个问题。肯定是回归测试。
HTTP/1.1200OKX-Powered-By: ExpressAccess-Control-Allow-Origin: *Content-Type: application/json;charset=utf-8Content-Length: 155ETag: W/"9b-mbrRmusN4ADjvBFA5aFJNLyRMHs"Date: Sat,
04Apr202014: 35: 09GMTConnection: keep-alive{
  "data": {
    "memberLoginHook": {
      "id": "1bb4ca87-d9f6-4ccb-a2a4-0249b19699b3",
      "occupation": "C3PO",
      "positions": [
        {
          "id": "f4deaf82-ad87-472b-82ab-c78d08138526"
        }
      ]
    }
  }
}