背景
开发工具: 微信开发者工具
腾讯云环境: node
问题
之前做了一个账本excel导出功能,可见用exceljs实现Json对象导出excel。大体逻辑是在项目根目录生成一个临时的excel文件,然后通过邮件发送给用户之后,删除临时文件。
在本地测试通过之后,部署到腾讯云开发环境,点击导出按钮,就报错了。直接请求failed,看了下报错信息:
思路
问题其实比较明确,没有权限。按照功能的实现思路,在生成excel文件时第一次打开,发送邮件时第二次用到这个文件。所以问题应该出在程序无法在根目录写入文件,生成excel文件。
注:后续和腾讯云确认,根目录的确是授权给单独一个用户用于部署程序,所以node运行用户无权限在根目录写入文件。
那么解决方法就只有两个
- 找一个有权限的目录
- 给node运行的用户授权
腾讯云的小程序服务器端部署是一套完整的自动化流程,个人无法直接访问服务器确认用户权限,所以在不更换部署服务的情况下,只能选择第一种。
解决
由于使用的腾讯官方的wafer2
框架,在demo
中是有上传文件的案例的。
在wafer-node-sdk
的node包中lib\upload\index.js
中可以看到源代码:
1 | // 初始化 multiparty |
demo
中,文件是先上传至/tmp
目录下,然后再转保存在cos
中。由此可以确定/tmp
目录是可以写入文件的。
将代码中临时生成的excel文件路径也放在/tmp
目录下,果然问题解决了。
插曲
在部署到生产环境时,先上传代码,然后点击“安装依赖”,最后点击“部署代码”。一路都显示成功,但结果却发现node
环境挂了,直接用web访问生产环境提示bad getway
。
心里一紧,再次点击“部署代码”,这次有报错出来了,提示是某依赖没有找到。
于是又点了一次安装依赖,待提示安装成功之后,再点部署代码,就ok了。
事后咨询了腾讯云的支持,理论上生产环境的部署是不需要手动安装依赖的。系统会自动从package.json
中拉取依赖清单并安装。这次就不知道是什么情况,记录一下。