Node.js如何读取文件,然后用两个单独的函数编写相同的文件?

我想要做的是读取一个文件,然后能够在写入文件时使用该信息执行其他操作。 例如:

读取文件写入文件,同时执行MD5哈希,数字签名等。

我可以使用fs.readfile和fs.writefile作为一个操作,只是从Web服务器将文件复制到我的电脑,但我不认为我仍然可以做这些相同的操作。 无论如何,跳过之间的东西。 如何使用fs.readfile和writefile来创build两个单独的函数来复制文件? 这是我一直在努力,是的,我已经广泛阅读这些论坛寻找答案。

var fs = require('fs'); function getData(srcPath) { fs.readFile(srcPath, 'utf8', function (err, data) { if (err) throw err; return data; } ); } function writeData(savPath, srcPath) { fs.writeFile (savPath, (getData(srcPath)), function(err) { if (err) throw err; console.log('complete'); } ); } //getData ('./test/test.txt'); writeData ('./test/test1.txt','./test/test.txt'); 

我希望能够下载任何types的文件,只需制作原始副本,将md5哈希等附加到JSON文件。 这可能是稍后的问题。

正如dandavis在他的评论中所build议的那样, readFile什么也不做,因为它是一个asynchronous调用。 看看这个答案,以获取更多信息。

简而言之,asynchronous调用永远不会等待结果返回。 在你的例子中, getData不会等待readFile()返回你想要的结果,但会立即结束。 asynchronous调用通常通过传递callbacks来处理,这是readFilewriteFile的最后一个参数。

无论如何,有两种方法可以做到这一点:

1.asynchronous执行(这是正确的方法):

 function copyData(savPath, srcPath) { fs.readFile(srcPath, 'utf8', function (err, data) { if (err) throw err; //Do your processing, MD5, send a satellite to the moon, etc. fs.writeFile (savPath, data, function(err) { if (err) throw err; console.log('complete'); }); }); } 

2.同步进行。 你的代码不会有太大的改变,你只需要分别用readFilewriteFile来代替readFilewriteFile警告 :使用这种方法不仅违背最佳实践,而且违背了使用nodejs的目的(除非你有一个非常合理的理由)。

编辑 :根据OP的请求,这里是一个可能的方法来分离两个方法,例如,使用callback:

 function getFileContent(srcPath, callback) { fs.readFile(srcPath, 'utf8', function (err, data) { if (err) throw err; callback(data); } ); } function copyFileContent(savPath, srcPath) { getFileContent(srcPath, function(data) { fs.writeFile (savPath, data, function(err) { if (err) throw err; console.log('complete'); }); }); } 

这样,你就可以将读取部分(在getFileContent )从复制部分分离出来。