使用 raspberry pi 上的节点将 csv 文件保存到 USB 驱动器时出现问题

Issue saving a cvs file to a usb drive using node on a raspberry pi

这个真的让我费尽心思!请帮忙!

所以我有一点 raspberry pi 2 运行 debian 和 node 0.12.6.

节点脚本侦听家庭自动化总线的事件并将这些事件保存到 json 列表中。然后使用 cron 作业每小时(每分钟用于测试)将此列表保存到 cvs 到系统启动时安装的 USB 驱动器。

问题是每次调用 fs.writeFile 都会抛出错误。

只有当我尝试保存到 USB 驱动器而不是本地文件夹时才会发生这种情况,后者工作正常。

我更改了 /etc/fstab 文件以包含以下内容

/dev/sda1       /home/pi/knx/usb        vfat    user,auto,nodev,gid=pi,uid=pi,fmask=0111,dmask=0000    0    0

这似乎是在启动时挂载 USB,我可以作为 pi 用户从控制台制作目录和文件没有问题。

文件夹(U盘挂载在usb)的权限是这样的....

pi@raspberrypi ~/knx $ ls -l
total 24
-rw-r--r-- 1 pi pi  965 Nov 20 16:40 app.js
drwxr-xr-x 2 pi pi 4096 Nov 20 16:00 data_files
drwxr-xr-x 2 pi pi 4096 Nov 19 12:27 install_scripts
drwxr-xr-x 7 pi pi 4096 Nov 20 16:21 node_modules
drwxrwxrwx 8 pi pi 8192 Jan  1  1970 usb

驱动器看起来安装正常....

pi@raspberrypi ~/knx $ lsblk
NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda           8:0    1  15G  0 disk 
└─sda1        8:1    1  15G  0 part /home/pi/knx/usb

节点脚本是...

//set up chron job to save list
var job = new CronJob({
  cronTime: '00 0-59 * * * *',
  onTick: function() {
    console.log('saving file');
      json2csv({ data: listToSave, fields: fields }, function(err, csv) {
        if (err) console.log(err);
        tempfilename = new Date();
        fname = './usb/data_files/'+ tempfilename.toString() +'.csv';
        console.log(fname);
        fs.writeFile(fname, csv, function(err) {
          if (err) throw err;
          console.log('file saved');
          listToSave=[];
        });
      });
  
  },
  start: true,
});

fname 看起来像这样....

'./usb/data_files/Fri Nov 20 2015 16:42:00 GMT+0000 (UTC).csv'

如果我有头发 - 我现在早就把它拔出来了!

有什么解决方案吗?

您使用 "new Date()" 创建的文件名似乎是文件系统的无效格式。 我可以通过将原始日期字符串格式化为更友好的文件名来使您的代码正常工作:

var utils = require('util')

上面添加了用于字符串格式化的 util 模块。

var today = new Date();
var fname = utils.format('./usb/%s-%s-%s.csv', today.getMonth(), today.getDay(), today.getHours());

这会写入一个 "MM-dd.csv" 文件名,它似乎可以在我的 debian 机器上运行。您可以通过添加时间、年份等来扩展它。