我有一个使用节点serverless deploy
在AWS lambda中运行的简单无服务器网站,然后我向该网站添加了更多内容并更新为最新版本的无服务器,现在我部署该网站并访问获得的URL :
{"message": "Internal server error"}
当我访问lambda控制台时,我得到:
{
"errorType": "Runtime.ImportModuleError",
"errorMessage": "Error: Cannot find module './dist/server'",
"trace": [
"Runtime.ImportModuleError: Error: Cannot find module './dist/server'",
" at _loadUserApp (/var/runtime/UserFunction.js:100:13)",
" at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
" at Object.<anonymous> (/var/runtime/index.js:45:30)",
" at Module._compile (internal/modules/cjs/loader.js:778:30)",
" at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)",
" at Module.load (internal/modules/cjs/loader.js:653:32)",
" at tryModuleLoad (internal/modules/cjs/loader.js:593:12)",
" at Function.Module._load (internal/modules/cjs/loader.js:585:3)",
" at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)",
" at startup (internal/bootstrap/node.js:283:19)"
]
}
有什么解决方法吗?
更多信息
基于@Amit Baranes的注释,下面的注释this SO post是Angular网站。我不太了解我需要更改处理程序名称以匹配我的站点结构。我自己没有将文件捆绑到.zip中,而是通过节点运行serverless deploy
命令:
这是网站serverless.yml
# generated by @ng-toolkit/serverless
service: serverless-site
plugins:
- serverless-apigw-binary
provider:
name: aws
runtime: nodejs10.x
memorySize: 192
timeout: 10
stage: production
region: us-east-1
package:
exclude:
- src/**
- node_modules/**
- firebug-lite/**
- e2e/**
- coverage/**
- '!node_modules/aws-serverless-express/**'
- '!node_modules/binary-case/**'
- '!node_modules/type-is/**'
- '!node_modules/media-typer/**'
- '!node_modules/mime-types/**'
- '!node_modules/mime-db/**'
custom:
apigwBinary:
types:
- '*/*'
functions:
api:
handler: lambda.universal
events:
- http: ANY {proxy+}
- http: ANY /
这是网站的我的项目文件结构(从src目录开始)。
这是网站lambda部署时的功能:
由于该函数没有server.js。我试图通过修改server.ts并将其放在没有运气的文件夹中来创建:
// generated by Paul
//import 'zone.js/dist/zone-node';
//import 'reflect-metadata';
var express =require('express');
var cors= require('cors');
var compression =require('compression');
var join=require('path').join;
export const app = express();
app.use(compression());
app.use(cors());
const DIST_FOLDER = join(process.cwd(), 'dist/serverless-site');
app.get('*.*', express.static(join(DIST_FOLDER), {
maxAge: '1y'
}));
app.get('/*', (req, res) => {
res.sendFile(join(DIST_FOLDER + '/index.html'));
});
答案 0 :(得分:0)
我确实看到您正在使用ng-toolkit
软件包来为您的Angular应用程序提供通用+无服务器。
基于此,我确实认为您收到此错误是由于最新版本的软件包配置不正确,其中包括服务器文件上的某些错误以及与Angular/Universal
软件包的不匹配。
我确实建议同时Example Angular ng-toolkit检出示例存储库,它已经解决了该问题。
只需指出:这是由Angular Universal软件包的最新webpack.config
示意图中引入的externals
选项express-engine
引起的。评论该行,将解决您的问题。
目前对于我来说原因尚不明了,但希望我能提出关于该主题的发现。
干杯!
答案 1 :(得分:0)
所以看起来 server.js 不是在 dist 文件夹中创建的。
我通过在 npm run build:server:prod
之前运行 serverless deploy
使其正常工作
我的 package.json 中的相关行如下所示:
"build:server:serverless": "webpack --config webpack.server.config.js"
这可能不是正确的方法,但它解决了找不到 ./dist/server 的问题并使我遇到下一个错误:
{
"errorType": "TypeError",
"errorMessage": "express is not a function",
"stack": [
"TypeError: express is not a function",
" at Object.<anonymous> (/var/task/dist/server.js:9231:15)",
" at __webpack_require__ (/var/task/dist/server.js:21:30)",
" at /var/task/dist/server.js:85:18",
" at Object.<anonymous> (/var/task/dist/server.js:88:10)",
" at Module._compile (internal/modules/cjs/loader.js:778:30)",
" at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)",
" at Module.load (internal/modules/cjs/loader.js:653:32)",
" at tryModuleLoad (internal/modules/cjs/loader.js:593:12)",
" at Function.Module._load (internal/modules/cjs/loader.js:585:3)",
" at Module.require (internal/modules/cjs/loader.js:692:17)"
]
}
我通过在 tsconfig 文件中设置 esModuleInterop = false
修复了快速错误,感谢 AWS Serverless Lambda + Angular - TypeError: express is not a function