您好我正在Node JS中编写一个函数,我必须返回一个文件路径。我的问题是在我写入文件的那个函数中,我想在写完一个文件后完成然后我的返回应该有效。在查看代码之前,我知道这可能是重复的,我确实对此进行了研究,但我不仅仅是能够实现这一目标。我尝试过使用回调,但问题是我想返回一个已定义的值。因此,在做出任何判断要求重复或缺乏研究之前,请阅读代码。
此外,尝试在fs.append回调中返回值但仍未解决。
我的功能:
const fs = require('fs');
const path = require('path');
module.exports.createDownloadFile = (request) => {
let filePath;
if (request) {
const userID = xyz;
filePath = path.join(__dirname, userID.concat('.txt'));
fs.open(filePath, 'w', (err) => {
if (err) throw new Error('FILE_NOT_PRESENT');
fs.appendFile(filePath, 'content to write');
});
}
return filePath;
};
我正在获取我正在调用函数的filePath,它只是在那时文件是空的,这就是为什么我想在完全写入文件后返回。
答案 0 :(得分:0)
Promises允许您构建代码并返回更像传统同步代码的值。 util.promisify
可以帮助宣传常规节点回调函数。
const fs = require('fs')
const path = require('path')
const fsAppendFileAsync = util.promisify(fs.appendFile)
const fsOpenAsync = util.promisify(fs.open)
module.exports.createDownloadFile = async (request) => {
if (!request) throw new Error('nope')
const userID = xyz
let filePath = path.join(__dirname, userID.concat('.txt'))
let fd = await fsOpenAsync(filePath, 'w')
await fsAppendFileAsync(fd, 'content to write')
return filePath
};
请注意,async
/ await
是ES2017,需要Node.js 7.6+或Babel。
使用w
打开文件会创建或截断文件,并且promises将拒绝抛出的错误,因此我将错误处理程序排除在外。您可以使用try {} catch (e) {}
块来处理特定错误。
Bluebird承诺库也很有帮助,尤其是Promise.promisifyAll
,它为您创建了有希望的Async
方法:
const Promise = require('bluebird')
const fs = Promise.promisifyAll(require('fs'))
fs.appendFileAsync('file', 'content to write')
答案 1 :(得分:-1)
使用这样的承诺:
const fs = require('fs');
const path = require('path');
module.exports.createDownloadFile = (request) => {
return new Promise((resolve, reject) => {
let filePath;
if (request) {
const userID = xyz;
filePath = path.join(__dirname, userID.concat('.txt'));
fs.open(filePath, 'w', (err) => {
if (err) reject(err);
else
fs.appendFile(filePath, 'content to write', (err) => {
if (err)
reject(err)
else
resolve(filePath)
});
});
}
});
};
并将其称为:
createDownloadFile(requeset).then(filePath => {
console.log(filePath)
})
或使用不带Promise的同步函数:
module.exports.createDownloadFile = (request) => {
let filePath;
if (request) {
const userID = xyz;
filePath = path.join(__dirname, userID.concat('.txt'));
fs.openSync(filePath,"w");
fs.appendFileSync(filePath, 'content to write');
}
return filePath;
};