Meteor JS如何从服务器将文件写入磁盘

4

我正在编写一个名为'myPackage'的Meteor包,需要使用Npm FileSystem和Pah模块将文件写入磁盘。该文件应位于example-app/packages/myPackage/auto_generated/myFile.js中,其中example-app项目已添加myPackage。

fs = Npm.require( 'fs' ) ;
path = Npm.require( 'path' ) ;

Meteor.methods( {
    autoGenerate : function( script ) {
        var myPath = '/Users/martinfox/tmp/auto-generated' ;
        var filePath = path.join(myPath, 'myFile.js' ) ;
                    console.log( filePath ) ;    // shows /Uses/martinfox/tmp/auto-generated/myFile.js 
        var buffer = new Buffer( script ) ;
        fs.writeFileSync( filePath, buffer ) ;
    },
} ); 

当我运行上面的代码(仅限服务器端)时,会得到以下结果:
Exception while invoking method 'autoGenerate' Error: ENOENT, 
no such file or directory '/Uses/martinfox/tmp/auto-generated/myFile.js'

注意 /Uses/martinfox/tmp/auto-generated 文件夹不存在

  1. 有任何想法是什么出了问题?
  2. 是否有可能获取到meteor项目目录的绝对路径?

1
你确定你的目录以/Uses开头而不是/Users吗? - C Blanchard
另外,关于你的第二个问题,__dirname会给出当前正在执行的脚本所在的目录名称。 - C Blanchard
@CBlanchard 抱歉我的笔误。问题1现在可以工作了,但我似乎无法获取var filePath = path.join(__dirname + 'test, myFile.txt)。 - mfox
我遇到了引用错误__dirname未定义。我也尝试了fs.__dirname。 - mfox
2个回答

11

要获取您的项目路径,可以在应用程序根目录中存储的main.js中执行此操作:

var fs = Npm.require('fs');
__ROOT_APP_PATH__ = fs.realpathSync('.');
console.log(__ROOT_APP_PATH__);

您也可以检查您的文件夹是否存在:

if (!fs.existsSync(myPath)) {
    throw new Error(myPath + " does not exists");
}

希望这能对你有所帮助


我不得不将你的第一行代码变成var fs = Npm.require('fs'),以避免在'require('fs')'上出现“未定义错误”。然后,我从返回的__ROOT_APP_PATH__中收到了路径'/Users/martinfox/Desktop/WEB-DEV/METEOR/Managers/my-example/.meteor/local/build/programs/server',从中我能够提取出包括'/my-example/'在内的内容,以获取应用程序项目的根文件夹,这正是我所需要的,所以谢谢你的回答。 - mfox
我修改了require以进行修正。还有一件事,每次运行Meteor时,它都会删除先前的安装,因此您必须将文件存储在Meteor文件夹之外。但这就是您预期要使用/Users...做的事情。 - Rebolon
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Kai Feng Chew
@KaiFengChew 如果你想在MeteorJs应用程序之外编写文件,只需执行fs.appendFile(ROOT_APP_PATH + '/../whereyouwant')。 - Rebolon
嗨@Rebolon,谢谢!问题已解决;-) - Kai Feng Chew

4

如果您只是想查找应用程序的绝对路径,您可以简单地执行var base = process.env.PWD,它将返回:/Users/[username]/[app-name]

这将避免额外的内容.meteor/local/build/programs/server


但是,在构建应用程序后,您将遇到问题,因为捆绑应用程序中没有 process.env.PWD - Paulo Alexandre
1
@paulequilibrio 在它被捆绑之前将其存储为全局变量。 - Pan Wangperawong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接