萌新请教两个关于 🥚 egg.js 的 Nodejs 相关问题

发布于 1周前 作者 yibo5220 来自 nodejs/Nestjs

萌新请教两个关于 🥚 egg.js 的 Nodejs 相关问题
1. 官方不推荐 pm2,那如何优雅的实现开机自动启动服务呢?写入到 init.d 吗?

2. 部署到 aliyun 的函数计算的最简单的方法是什么?我试过自定义环境但都失败了;腾讯云的 serverless 一键部署倒是成功了…

请各位大佬指点一下萌新,非常感谢

21 回复

51 分钟惨案…


docker 或者 systemd 吧

怎么这么黑

是 V2EX 的 node.js 板块就这样

请教下,pm2 可以开机自己启动服务吗?

搜一下 pm2 startup 我也是在找 egg 开机启动时看到的

egg 官方迷之自信,我也是为了自启动和方便管理,用了 pm2 。

有遇到什么坑没?

关于第 2 点有点好奇,是在函数里面起了一个 egg 服务? severless 应该不用自己起服务吧,直接写接口就好了

#8 暂时没有,目前是还没上线的项目用到(预计上线时也会用),可能不具备参考性,理论上没什么问题的

谢谢大佬,对我来说已经很有帮助



直接写接口 需要处理 request 和 response 这些 context,才能与 egg 兼容(吧?)

我的猜测是,severless 收到请求时,如果之前的服务还在,就将请求转发给 egg 服务;如果一段时间没请求就结束服务;所以长时间没请求之后的首次请求会比较慢;

这个猜测是基于阿里云函数计算的 自定义环境 中关于启动时间、服务端口 等推导而来,以及腾讯云的 severless 确实首次请求会比较慢;如果理解得不对请指正。

不推荐就不用么 明显 pm2 好用
如果容器环境用 docker 也行

除了官方不推荐 pm2,甚至官方的 issue 中看到了 “pm2 这么受欢迎很大一部分原因其实是好看” 这样的高赞评论,以至于让我怀疑是不是 pm2 和 egg 有什么坑……

faas 的冷启动慢是通病,办法是留一个保活接口过几分钟去请求一次,请求保活接口的函数也可以挂在 faas 上,用定时触发器

嗯嗯,这块是有经验的,之前玩过 php 的函数计算,刚刚找到官方的一篇文章,尝试一下成功了,嘿嘿

egg 不了解,如果没有实质的证据指出 pm2 和 egg 会有兼容问题的话,自己用什么顺手就用什么。

pm2 startup 可以用来配置系统自启,详细看手册。

如果团队有意向用 K8s 之类的容器管理方案的话,用 docker 直接在容器启动的时候用 node 指令执行程序就行了,node 进程退出则容器停止,然后就可以通过管理容器的启动、停止、重启来管理程序了。

如果不折腾容器的话,也可以自己写 init.d\service\systemd 服务管理配置。

我之前用 pm2 启 egg,之后 cpu 占用率一直莫名其妙的高,你注意下这个问题。。。没出现就可以继续用。。

我们就 PM2 启 egg,没啥问题




谢谢二位大佬

当然可以,以下是针对你提到的关于 Egg.js 的两个问题的回复:


你好,很高兴能帮助你解答关于 Egg.js 的问题。Egg.js 是一个基于 Koa 的企业级 Node.js 框架,提供了丰富的插件机制和高度的可扩展性。

问题一:如何在 Egg.js 中实现中间件?

在 Egg.js 中,中间件(Middleware)通常用于处理 HTTP 请求和响应。你可以通过配置 config/config.default.js 文件中的 middleware 字段来添加中间件。例如:

// config/config.default.js
exports.middleware = ['myMiddleware'];

然后在 app/middleware/myMiddleware.js 中定义中间件:

module.exports = () => {
  return async function myMiddleware(ctx, next) {
    console.log('Request URL:', ctx.url);
    await next();
    console.log('Response Status:', ctx.status);
  };
};

问题二:如何配置和使用服务(Service)?

服务(Service)在 Egg.js 中用于封装业务逻辑。你可以在 app/service/ 目录下创建服务文件,并在控制器中调用。例如,创建一个 user.js 服务:

// app/service/user.js
const { Service } = require('egg');

class UserService extends Service {
  async getUserById(id) {
    // 业务逻辑
    return { id, name: 'John Doe' };
  }
}

module.exports = UserService;

在控制器中调用服务:

// app/controller/user.js
const { Controller } = require('egg');

class UserController extends Controller {
  async getUser() {
    const { ctx } = this;
    const userId = ctx.params.id;
    const user = await ctx.service.user.getUserById(userId);
    ctx.body = user;
  }
}

module.exports = UserController;

希望这些回答能帮到你!如果有更多问题,欢迎继续提问。


回到顶部