【问题标题】:Fs.readFile on FTP serverFTP 服务器上的 Fs.readFile
【发布时间】:2018-07-25 08:16:25
【问题描述】:

我在 Node.js 中有一些脚本,当我在我的计算机上运行它时它可以工作,但当我在服务器上时却不行。 我有两台服务器:我在第一台(服务器 1)上运行 webApplication,第二台(服务器 2)包含文件。

var fs = require('fs');
var FTPClient = require('ftp');
var c = new FTPClient();

c.connect({
  host: "192.168.200.2",
  user: "*****",
  password: "******"
});

c.on('ready', function() {

  console.log("Connected to datastore !");

  var dateFile = './Dictionnary/lastUpdate.json';
  var csvFile = '//192.168.200.2/Alfa/file4457.csv'
  var lastUpdate;

  fs.stat(csvFile, (err, stat) => {
    if (err) {
      console.error(err);
    };

    var date = { mtime: stat.mtime }

    var lastDate = new Date(jsonfile.readFileSync(dateFile).mtime);

    var newDate = new Date(stat.mtime);

    if (newDate <= lastDate) {
      console.log('Dictionnary up-to-date');
    } else {
      console.log('Update Needed');
      var DeleteQuery = mySqlClient.query('DELETE FROM dictionnary');
      csv = fs.readFile(csvFile, 'utf-8', (err, data) => {
        if (err) {
          throw err
        };
        dictionnary = parseCSV(data);
        for (i = 0; i < dictionnary.length - 1; i++) {
          var insertQuery = ("INSERT INTO Dictionnary VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
          var query = mySqlClient.query(insertQuery, [dictionnary[i][0], dictionnary[i][1], dictionnary[i][2], dictionnary[i][3], dictionnary[i][4], dictionnary[i][5], dictionnary[i][6], dictionnary[i][7], dictionnary[i][8], dictionnary[i][9], dictionnary[i][10], , dictionnary[i][11], , dictionnary[i][12]]);
         };
      }
   }
}

当我在我的计算机上运行脚本时,我可以在(服务器 2)上找到该文件,但是当我在(服务器 1)上运行它时,它不再工作并且出现此错误:

 Error: ENOENT: no such file or directory, open '//192.168.200.2/Alfa/file4457.csv'

我认为这是 pass 的问题,所以我尝试使用 //192.168.200.2/Alfa/file4457.csv./Alfa/file4457.csvAlfa/file4457.csv

但这不起作用。

我检查了路径,他很好。

对于fs.stat(),这不是问题,我仍然可以用c.lastMod() 替换它,但我找不到可以用来替换fs.readFile() 的东西

感谢您的阅读。

【问题讨论】:

    标签: node.js ftp fs


    【解决方案1】:

    fs 将查看您为其指定的路径//192.168.200.2/Alfa/file4457.csv

    在您正在执行脚本的服务器上,找不到此路径。我不知道您的网络和服务器架构,所以我无法真正解释为什么它可以在您的计算机上运行而不是在服务器上运行。但我猜你的电脑和 FTP 服务器在同一个本地网络上(如果我错了,请纠正)。

    阅读您的代码后,您将在远程 FTP 服务器上打开一个 FTP 连接:

    c.connect({
      host: "192.168.200.2",
      user: "*****",
      password: "******"
    });
    
    c.on('ready', function() {
        ...
    });
    

    但是在 .on('ready', function() { ... }) 回调中,您不会对这个新打开的连接执行任何操作(查看您的代码,您再也不会使用 c)。

    通过阅读ftp节点模块documentation,你可以发现有get函数,可以从你的FTP连接中检索文件。

    get(path, [useCompression, ]callback) - (void) - 从服务器检索路径中的文件。 useCompression 默认为 false。 callback 有 2 个参数:err, fileStream.

    所以,你必须使用类似的 FTP 连接:

    c.connect({
       host: "192.168.200.2",
       user: "*****",
       password: "******"
    });
    
    c.on('ready', function() {
        c.get('/Alfa/file4457.csv', function(err, stream) {
             var content = '';
             stream.on('data', function(chunk) {
                 content += chunk.toString();
             });
             stream.on('end', function() {
                 // content variable now contains all file content. 
             });
        })
    });
    

    【讨论】:

    • 通过流我可以访问文件的内容吗?
    • 当然,我更新了我的答案,看看文档:nodejs.org/api/stream.html
    • 非常感谢
    最近更新 更多