[eggjs/egg]egg serverless部署,经常出现 too many open files 错误

2024-06-28 609 views
0
在此输入你需要反馈的 Bug 具体信息(Bug in Detail):
{"errorCode":1,"errorMessage":"user code exception caught","stackTrace":"Error: EMFILE: too many open files, open '/var/user/package.json'\n    at Object.openSync (fs.js:438:3)\n    at Object.readFileSync (fs.js:343:35)\n    at Object.exports.readJSONSync (/var/user/node_modules/utility/lib/json.js:19:24)\n    at new EggLoader (/var/user/node_modules/egg-core/lib/loader/egg_loader.js:44:24)\n    at new AppWorkerLoader (/var/user/node_modules/egg/lib/loader/app_worker_loader.js:9:1)\n    at new EggCore (/var/user/node_modules/egg-core/lib/egg.js:121:19)\n    at new EggApplication (/var/user/node_modules/egg/lib/egg.js:47:5)\n    at new Application (/var/user/node_modules/egg/lib/application.js:60:5)\n    at Object.exports.tcbGetApp (/var/user/app.js:36:10)\n    at Runtime.module.exports.main [as handler] (/var/user/tcbindex.js:21:23)","statusCode":430}
可复现问题的仓库地址(Reproduction Repo)

https://github.com/nanhupatar/tcb-egg-debug-demo

Node 版本号:

v12.0

Eggjs 版本号:

^2.15.1

相关插件名称与版本号(PlugIn and Name):

mysql2 egg-sequelize

操作平台与版本号(Platform and Version):

mac

回答

9
  const config = (exports = {
    env: 'prod', // 推荐云函数的 egg 运行环境变量修改为 prod
    rundir: '/tmp',
    logger: {
      dir: '/tmp',
      level: 'NONE',
      consoleLevel: 'NONE',
      file: null,
    },
  });

依旧不行 能否把所有的日志都关掉

8

因为cloudbase 里面就是这么写的

7

这是我的app.js

'use strict';

const { Application } = require('egg');

exports.tcbGetApp = () => {
  return new Application({
    env: 'prod',
  });
};
3
image
3

你可以看看 egg 的文档,这个是 egg 的一个生命周期入口,写在这里我觉得有问题。 cloudbase 那边给的 demo 不一定合理,你可以找那边的维护人员问问,我不确定这样跑会不会有问题,从日志来看感觉是递归初始化 application 导致重复初始化,然后打开 package.json 太多次了。

他们客服的回复是不正确的,你这个用法不是 Egg 推荐的用法,我们是通过 egg-scripts 去启动的,如果你们要单进程的话要自己试下我们的那个单进程启动方式,有个 egg.start 的方法。

3

好的 我看看

7

按照这个说法 ,我把exports.tcbGetApp 放到index.js里,然后删除app.js 是不是可以避免这个问题,(递归初始化)的问题

4

也就是把app.js改成index.js

3

egg 的官方启动方式不是 new Application 那么简单,还有 agent 的,如果你要定制,可以看下 egg 里面那个 start 方法怎么写,另外可以参考 egg-cluster, egg-mock

0

目前是app.js改成index.js先暂时解决问题,