这里,’fs‘是什么。
fs 模块是文件操作的封装,它提供了文件的读取、写入、更名、删除、遍历目录、链接等 POSIX 文件系统操作。与其他模块不同的是,fs 模块中所有的操作都提供了异步的和同步的两个版本, 例如读取文件内容的函数有异步的 fs.readFile() 和同步的fs.readFileSync()。
1、fs.readFile
fs.readFile(filename,[encoding],[callback(err,data)])是最简单的读取文件的函数。它接受一个必选参数 filename,表示要读取的文件名。第二个参数 encoding是可选的,表示文件的字符编码。callback 是回调函数,用于接收文件的内容。如果不指定 encoding,则 callback 就是第二个参数。回调函数提供两个参数 err 和 data,err 表示有没有错误发生,data 是文件内容。如果指定了 encoding,data 是一个解析后的字符串,否则 data 将会是以 Buffer 形式表示的二进制数据。
不指定编码方式就默认使用二进制的方式进行读取数据。
var fs = require('fs');fs.readFile('content.txt', function(err, data) {if (err) {console.error(err);} else {console.log(data);}});
2、fs.readFileSync
fs.readFileSync(filename, [encoding])是 fs.readFile 同步的版本。它接受的参数和 fs.readFile 相同,而读取到的文件内容会以函数返回值的形式返回。如果有错误发生,fs 将会抛出异常,你需要使用 try 和 catch 捕捉并处理异常。
3、fs.open
fs.open(path, flags, [mode], [callback(err, fd)])是 POSIX open 函数的封装,与 C 语言标准库中的 fopen 函数类似。它接受两个必选参数,path 为文件的路径,flags 可以是以下值。
r :以读取模式打开文件。
r+ :以读写模式打开文件。
w :以写入模式打开文件,如果文件不存在则创建。
w+ :以读写模式打开文件,如果文件不存在则创建。
a :以追加模式打开文件,如果文件不存在则创建。
a+ :以读取追加模式打开文件,如果文件不存在则创建。
mode 参数用于创建文件时给文件指定权限,默认是 0666①。回调函数将会传递一个文件描述符 fd②。
4、fs.read
fs.read(fd, buffer, offset, length, position, [callback(err, bytesRead,buffer)])是 POSIX read 函数的封装,相比fs.readFile 提供了更底层的接口。fs.read的功能是从指定的文件描述符 fd 中读取数据并写入 buffer 指向的缓冲区对象。offset 是buffer 的写入偏移量。length 是要从文件中读取的字节数。position 是文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。回调函数传递bytesRead 和 buffer,分别表示读取的字节数和缓冲区对象。
实例:
var fs = require('fs');
fs.open('content.txt', 'r', function(err, fd) {
if (err) {
console.error(err);
return;
}
var buf = new Buffer(8);
fs.read(fd, buf, 0, 8, null, function(err, bytesRead, buffer) {
if (err) {
console.error(err);
return;
}
console.log('bytesRead: ' + bytesRead);
console.log(buffer);
}
)
}
);
fs 模块函数表
遇到的问题及解决方式
-
使用connect-mongdo时,报错:Cannot read property 'Store' of undefined
解决: require('connect-mongo')的时候加一个参数express,如下:
var express = require('express'); var MongoStore = require('connect-mongo')(express),
-
使用app.use(express.router(routers)) 提示 has no method 'router'
解决:原因可能是express 3.0后没有了router这个方法,继续使用之前的app.use(app.router),在app.js末尾加入:
routers(app);
(这样routes/inndex.js 可以继续使用书中的书写格式.)
-
req调用flash时报错,TypeError: Object #<IncomingMessage> has no method 'flash'
查看express的issues发现,flash在3.0+后的版本中已经不支持了。见
-
Express中路径控制,如果url中需要参数:
app.get('/user/:username',function(req,res){res.send('your content');});
-
使用dynamicHelpers时,app(req, res){ app.handle(req, res); } has no method 'dynamicHelpers'
exports 和 module.exports 的区别
Here is an eye-opener - module.exports is the real deal. exports is just module.exports's little helper. Your module returns module.exports to the caller ultimately, not exports. All exports does is collect properties and attach them to module.exports IF module.exports doesn't have something on it already. If there's something attached to module.exports already, everything on exports is ignored.
So you get the point now - if you want your module to be of a specific object type, usemodule.exports; if you want your module to be a typical module instance, useexports.
Having said that, exports is the recommended object unless you are planning to change the object type of your module from the traditional 'module instance' to something else.
解析exports.start1 = start2;
var http = require("http");
function start2() {
function onRequest(request, response){
console.log('server received')
response.writeHead(200,{"Content-Type":"text/plain"});
response.write("hello word");
response.end();
}
http.createServer(onRequest).listen(8888);
}
exports.start1 = start2;
在index.js文件中
var server = require("./server");
server.start1();
这样使用,文件能正常运行,不会报错,另外
function onRequest(request, response)
这里面的两个参数request和response是可以随意改名字的,换成aaa和bbb也能正常运行,但是一般情况下,建议还是使用request和response
request
request