写入文件后返回值已完成

时间:2017-11-21 21:23:46

标签: javascript node.js promise

您好我正在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,它只是在那时文件是空的,这就是为什么我想在完全写入文件后返回。

2 个答案:

答案 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;
};