摘要:前两天将一个部署到服务器时,用就是启动不了,错误信息为无权限创建目录。查看工作目录权限,当前用户是有权限的,看了源码,原来是用的包的问题。首先,在生产环境下的启动是通过启动的。
前两天将一个egg部署到服务器时,用npm start就是启动不了,错误信息为无权限创建log目录。查看工作目录权限,当前用户是有权限的,看了源码,原来是用的npm包的问题。这里简单记录下解决过程。
首先,在生产环境下的启动是通过egg-script 启动的。在启动时,终端会有如下输出:
Save log file to /XXX/XXX
我们查看egg-script的源码,在他的start命令中,找到Save log file,如下
下一步,找到这个logDir变量声明的地方,往前看就能找到,如下代码:
const HOME = homedir(); const logDir = path.join(HOME, "logs");
那么这个homeDir()是什么呢?它是npm包node-homedir,它的方法体如下:
const os = require("os"); module.exports = () => { if (process.env.MOCK_HOME_DIR) return process.env.MOCK_HOME_DIR; if (os.userInfo && os.userInfo().homedir) { return os.userInfo().homedir; } else if (os.homedir) { return os.homedir(); } return process.env.HOME; };
这就很清楚了,我的服务器是centos,登录账户的userInfo最终返回的homedir就是系统根目录,"/",而不是我的项目工作目录,由于运维设置,我没有权限在系统/logs下写权限,所以出现了一开始提到的错误。
找到原因后就很好办了,按上面的源码,在启动脚本里,先创建个MOCK_HOME_DIR的环境变量,并指定到项目目录即可。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/93334.html
摘要:好吧且不说抽象统一处理的事,解决问题才是目的。确实把整个错误处理可以完整的抽象出来。当然可以在中注入更多统一处理函数,也可以通过函数名做一些判断,比如对所有名字中包含的函数进行单独的日志处理。 起因 在之前的项目中我发现每个控制器大约都是这样写的 async function findId (id) { let res; try{ res = await...
摘要:今天就简要说说下的实现。主要的原因是的文档写的不太清楚,方便新人快速上手。导致我们一目十行去扫文档的时候,有时总会觉得有些莫名,的实现就是其中之一。其实这和我本身对的了解不深入有关,但是也没有文档和我说实现啊。 这两天真的是宅的骨头都发霉了,春困秋乏夏打盹,也是醉了。今天就简要说说eggjs下Restful API的实现。主要的原因是egg的文档写的不太清楚,方便新人快速上手。话说eg...
摘要:由于中的都是服务,所以需要一个插件来调用服务。可以看到,只是一个封装,真正对工作委托给了也就是。在里,我们进行了方法的绑定,这样在里,就可以像调用方法一样,调用服务了。完成后,补齐单元测试,发布到库里就可。 由于MVC中的M都是dubbo服务,所以需要一个插件来调用dubbo服务。个人推荐这个包node-zookeeper-dubbo 我们所需要的只是把他封装成一个插件,使用方式则类似...
摘要:到这里,基于的前后端分离实现方案就搞定啦四关于的一些思考实际上,在使用的过程中有一个比较致命的缺点,就是一旦签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。结语以上是关于基于的前后端分离实现方案的总结和思考。 一、jwt是什么 JWT全称, JSON Web Token,是一个以JSON为基准的标准规范。 举例:服务器认证以后,生成一个 JSON 对象,发回给用户,就像下...
阅读 2461·2021-09-22 16:05
阅读 2920·2021-09-10 11:24
阅读 3612·2019-08-30 12:47
阅读 2919·2019-08-29 15:42
阅读 3351·2019-08-29 15:32
阅读 1924·2019-08-26 11:48
阅读 1063·2019-08-23 14:40
阅读 887·2019-08-23 14:33