Node.js:fs.readdir不返回fs.writeFile写的文件

时间:2017-04-18 08:31:57

标签: node.js file asynchronous

我的应用

一个简单的Node.js http服务器,它通过调用POST /deploy在给定目录中创建文件。写入文件后,我想使用console.log列出该目录中的所有文件。

为了创建文件(POST /deploy),我打电话给:

fs.writeFile(filename, content, 'utf8', callback(null, {'newFile': filename})); 

回调写入HTTP响应并使用以下内容列出文件:

fs.readdir(some_directory, (err, files) => {
    files.forEach(file => {
        console.log(file);
        // Do something with the file
    }
}

我的问题

回调中未列出新文件。只有在我再次调用deploy后,才会列出上一个文件。例如,如果我连续使用a创建文件b/deploy,则仅在创建ab未创建b时列出fs.readdir列出直到我再打一次电话。

我假设在调用回调时文件没有关闭,以便以后只有fs.readdir的调用才会在文件关闭后看到。

如何在文件正确关闭后调用回调函数,并且可以使用fd列出?

我尝试了什么

  • 阅读fs.close()手册。它工作,但需要一个 DownloadManager mgr = (DownloadManager) this.getSystemService(Context.DOWNLOAD_SERVICE); boolean isDownloading = false; DownloadManager.Query query = new DownloadManager.Query(); query.setFilterByStatus( DownloadManager.STATUS_PAUSED| DownloadManager.STATUS_PENDING| DownloadManager.STATUS_RUNNING| DownloadManager.STATUS_SUCCESSFUL ); Cursor cur = mgr.query(query); int col = cur.getColumnIndex( DownloadManager.COLUMN_LOCAL_FILENAME); for(cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) { isDownloading = isDownloading || ("local file path" == cur.getString(col)); } cur.close(); if (!isDownloading) { Uri source = Uri.parse(myWebsites[j]); Uri dst_uri = Uri.parse("file:///mnt/sdcard/Signagee"); DownloadManager.Request request = new DownloadManager.Request(source); request.setDestinationUri(dst_uri); request.setNotificationVisibility( DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED ); request.allowScanningByMediaScanner(); long id = mgr.enqueue(request); } ,而不是文件名,所以我必须打开文件只是为了关闭它,这似乎很麻烦:

    fs.open(filename,' w',function(error,fd){     fs.write(fd,content,function(err,written,buffer){         fs.close(fd,callback(null,{' newFile':filename}));

        }); });

  • 在搜索SO

  • 中搜索类似问题

1 个答案:

答案 0 :(得分:2)

我认为这是你的问题:

fs.writeFile(filename, content, 'utf8', callback(null, {'newFile': filename})); 

在上面的代码中,您可以立即运行回调,而无需等待操作完成。只有当你对callback(null, {'newFile': filename})的调用实际上返回一个函数来调用它作为回调时,它才会起作用,我怀疑它是否会这样做。

这可能有所帮助:

fs.writeFile(filename, content, 'utf8', () => callback(null, {'newFile': filename})); 

因为这里将在写操作完成后调用callback()。但这还不够,因为你需要处理错误:

fs.writeFile(filename, content, 'utf8', (err) => {
  if (err) {
    // handle possible errors
  } else {
    callback(null, {'newFile': filename});
  }
});

e.g。如果您的callback可以将错误视为您可以执行的第一个参数:

fs.writeFile(filename, content, 'utf8', (err) => {
  if (err) {
    callback(err);
  } else {
    callback(null, {'newFile': filename});
  }
});

或提前退回,您可以避免else

fs.writeFile(filename, content, 'utf8', (err) => {
  if (err) {
    return callback(err);
  }
  callback(null, {'newFile': filename});
});