小程序部署EACCES: permission denied问题

背景

开发工具: 微信开发者工具

腾讯云环境: node

问题

之前做了一个账本excel导出功能,可见用exceljs实现Json对象导出excel。大体逻辑是在项目根目录生成一个临时的excel文件,然后通过邮件发送给用户之后,删除临时文件。

在本地测试通过之后,部署到腾讯云开发环境,点击导出按钮,就报错了。直接请求failed,看了下报错信息:

permission_deny

思路

问题其实比较明确,没有权限。按照功能的实现思路,在生成excel文件时第一次打开,发送邮件时第二次用到这个文件。所以问题应该出在程序无法在根目录写入文件,生成excel文件。

:后续和腾讯云确认,根目录的确是授权给单独一个用户用于部署程序,所以node运行用户无权限在根目录写入文件。

那么解决方法就只有两个

  • 找一个有权限的目录
  • 给node运行的用户授权

腾讯云的小程序服务器端部署是一套完整的自动化流程,个人无法直接访问服务器确认用户权限,所以在不更换部署服务的情况下,只能选择第一种。

解决

由于使用的腾讯官方的wafer2框架,在demo中是有上传文件的案例的。

wafer-node-sdk的node包中lib\upload\index.js中可以看到源代码:

1
2
3
4
5
6
7
// 初始化 multiparty
const form = new multiparty.Form({
encoding: 'utf8',
maxFilesSize: maxSize * 1024 * 1024,
autoFiles: true,
uploadDir: '/tmp'
})

demo中,文件是先上传至/tmp目录下,然后再转保存在cos中。由此可以确定/tmp目录是可以写入文件的。

将代码中临时生成的excel文件路径也放在/tmp目录下,果然问题解决了。

插曲

在部署到生产环境时,先上传代码,然后点击“安装依赖”,最后点击“部署代码”。一路都显示成功,但结果却发现node环境挂了,直接用web访问生产环境提示bad getway

BadGateway

心里一紧,再次点击“部署代码”,这次有报错出来了,提示是某依赖没有找到。

于是又点了一次安装依赖,待提示安装成功之后,再点部署代码,就ok了。

事后咨询了腾讯云的支持,理论上生产环境的部署是不需要手动安装依赖的。系统会自动从package.json中拉取依赖清单并安装。这次就不知道是什么情况,记录一下。