萌新请教两个关于 🥚 egg.js 的 Nodejs 相关问题
萌新请教两个关于 🥚 egg.js 的 Nodejs 相关问题
1. 官方不推荐 pm2,那如何优雅的实现开机自动启动服务呢?写入到 init.d 吗?
2. 部署到 aliyun 的函数计算的最简单的方法是什么?我试过自定义环境但都失败了;腾讯云的 serverless 一键部署倒是成功了…
请各位大佬指点一下萌新,非常感谢
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 上,用定时触发器
egg 不了解,如果没有实质的证据指出 pm2 和 egg 会有兼容问题的话,自己用什么顺手就用什么。
pm2 startup 可以用来配置系统自启,详细看手册。
如果团队有意向用 K8s 之类的容器管理方案的话,用 docker 直接在容器启动的时候用 node 指令执行程序就行了,node 进程退出则容器停止,然后就可以通过管理容器的启动、停止、重启来管理程序了。
如果不折腾容器的话,也可以自己写 init.d\service\systemd 服务管理配置。
我之前用 pm2 启 egg,之后 cpu 占用率一直莫名其妙的高,你注意下这个问题。。。没出现就可以继续用。。
谢谢二位大佬
当然可以,以下是针对你提到的关于 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;
希望这些回答能帮到你!如果有更多问题,欢迎继续提问。