Tod*_*eck 25 javascript node.js
我想要做的是读取一个文件,然后在我写文件时能够使用该信息执行其他操作.例如:
读取文件写入文件,同时执行MD5哈希,数字签名等.
我可以使用fs.readfile和fs.writefile作为一个操作,只是将文件从Web服务器复制到我的计算机,但我不认为我仍然可以执行这些相同的操作.无论如何,跳过之间的东西.如何使用fs.readfile和writefile创建两个单独的函数来复制文件?这是我一直在努力的,是的,我已经广泛阅读这些论坛以寻找答案.
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');
Run Code Online (Sandbox Code Playgroud)
我希望能够下载任何类型的文件,只需制作原始副本,并将md5哈希等附加到JSON文件中.这可能是后来的问题.
ver*_*loc 26
正如dandavis在他的评论中所建议的那样,readFile什么也没做,因为它是一个异步调用.查看此答案以获取有关其含义的其他信息.
简而言之,异步调用永远不会等待结果返回.在您的示例中,getData不等待readFile()返回您想要的结果,但会立即完成.异步调用通常是由路过的处理callbacks,这是最后一个参数readFile和writeFile.
无论如何,有两种方法可以做到这一点:
1.异步(这是正确的方式):
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');
});
});
}
Run Code Online (Sandbox Code Playgroud)
2.同步.您的代码不会有太大的变化,你只需要更换readFile,并writeFile通过readFileSync和writeFileSync分别.警告:使用此方法不仅违反了最佳做法,而且违背了使用nodejs的目的(除非您有非常合理的理由).
编辑:根据OP的请求,这里有一种可能的方法来分离这两种方法,例如,使用回调:
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');
});
});
}
Run Code Online (Sandbox Code Playgroud)
这样,您将读取部分(in getFileContent)与复制部分分开.
我最近不得不使用它,所以我将 verybadallocs 的答案转换为承诺。
function readFile (srcPath) {
return new Promise(function (resolve, reject) {
fs.readFile(srcPath, 'utf8', function (err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
}
function writeFile (savPath, data) {
return new Promise(function (resolve, reject) {
fs.writeFile(savPath, data, function (err) {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}
Run Code Online (Sandbox Code Playgroud)
然后使用它们很简单。
readFile('path').then(function (results) {
results += ' test manipulation'
return writeFile('path', results)
}).then(function () {
//done writing file, can do other things
})
Run Code Online (Sandbox Code Playgroud)
异步/等待的用法
const results = await readFile('path')
results += ' test manipulation'
await writeFile('path', results)
// done writing file, can do other things
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
41617 次 |
| 最近记录: |