2011-10-08 62 views
2

作为文件的node.js回调fs.write不工作作为文件

fs.write(FD,缓冲器,偏移,长度,位置,[回调])

所以我写如:

var fs = require('fs'); 

fs.open('./example.txt', 'a', 0666, function(err, fd) { 
    if (err) { throw err; } 
    console.log('file opened'); 
    fs.write(fd, 'test', null, null, null, function(err) { 
    if (err) { throw err; } 
    console.log('file written'); 
    fs.close(fd, function() { 
     console.log('file closed'); 
    }); 
    }); 
}); 

但fs.write的回调没有被触发。输出只是'文件打开'。

fs.write(fd, 'test', null, null, function(err) { 

但我指定第5个参数不是第6个参数的回调。这是作品。 为什么与文档不同。

并在节点源(node_file.cc)中回调是第6个参数。

Local<Value> cb = args[5]; 

我不明白。

+0

和fs.open中的0666是什么意思? – Outsider

回答

4

fs.write的旧接口仍然受支持。它允许写入字符串。因为你给了一个字符串,而不是一个“缓冲”节点试图让你的论点符合这种旧的接口:

fs.write(fd, data, position, encoding, callback) 

注意,旧的接口有“回调”为公司第五届参数。对于第五个参数,你给它“空”:

fs.write(fd, 'test', null, null, null, function(err) { 

节点看到“空”为你的回调,因此没想到你给点回调。

按照建议使用缓冲区数据字符串,或者正确使用旧接口来使用普通字符串。如果您现在还没有准备好使用Buffer,只需使用“新缓冲区('test')”,直到您准备就绪。

3

您需要传递一个buffer,而不是将字符串作为fs.write的第二个参数。此外,回调将给出三个参数,而不是一个:

var buffer = new Buffer('test'); 
fs.write(fd, buffer, 0, buffer.length, null, function(err, written, buffer) { 

documentation

fs.write(FD,缓冲器,偏移,长度,位置,[回调])

将缓冲区写入由fd指定的文件。

偏移量和长度决定要写入的缓冲区的部分。

位置是指应该写入数据的文件开头的偏移量。如果position为null,则数据将写入当前位置。参见pwrite(2)。

回调将被赋予三个参数(err,written,buffer),其中写入指定从缓冲区中写入了多少个字节。

最后,在调用fs.open中'0666'代表UNIX file mode