我在Nodejs文件系统中遇到了一个奇怪的错误



我正在使用nodejs的文件系统协议。我确实编写了文件,读取文件,现在试图重命名它。它实际上将文件重命名,但给我带来了这个错误,我的本地主机停止运行。

这是错误:

_http_outgoing.js:690
      throw new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk);

typeError [err_invalid_arg_type]:"块"参数必须是类型字符串或缓冲区之一。收到的类型对象

file1: var fs = require('fs');
// write
function write(fileName, content) {
    return new Promise(function (resolve, reject) {
        fs.writeFile(`./test/${fileName}`, content, function (err, done) {
            if (err) {
                reject(err);
                return;
            }
            resolve(done);
            // console.log('file created >>', done);
        });
    })
}
function readFile(fileName, cb) {
    fs.readFile(`./test/${fileName}`, 'utf-8', function (err, done) {
        if (err) {
            cb(err);
            return;
        }
        cb(null, done);
    })
    }
function rename(oldname, newname, cb){
    fs.rename(`./bands/${oldname}`, `./bands/${newname}`, function(err,done){
        if(err){
            cb(err)
            return
        }
        cb(null,done)
    })
}
rename('pinkfloyd.txt', 'tool.txt', function(err, done){
    if(err){
        console.log('error in renaming')
    }
    else{
        console.log('renamed>>')
    }
})
readFile('kisor.txt', function(err,done){
    if(err){
        console.log("error in file reading >>",err);
    }else{
        console.log('success >>',done);
    }
})
write('kisor.txt', 'i am javascript')
    .then(function (data) {
        console.log('write success ', data);
    })
    .catch(function (err) {
        console.log('error in wirte >>', err);
    })
// objec short hand
module.exports = {
    write, readFile, rename
}

i have imported the exported stuff from file 1 here in this file:
//var { write,readFile, } = require('./file');// object destruct
var fileOp = require('./file1');
//console.log('file operation >>', fileOp);
fileOp.write('brodway.txt', 'i am infosys of  nepal')
    .then(function (data) {
        console.log('done >>>', data);
    })
    .catch(function(err){
        console.log('err',err);
    })
fileOp.readFile('kisor.txt',function(err,done){
    if(err){
        console.log('err',err);
    }else{
        console.log('success >>',done);
    }
and lastly, here is the server:
var http = require('http');
var fileOp = require('./file1');
var server = http.createServer(function (request, response) {
    // this function will be executed whenever a client is connected
    // request or 1st argument is http request object
    // response or 2nd argument is http response object
    var url = request.url;
    if (url == '/write') {
        fileOp.write('abcd.js', 'hi')
            .then(function (data) {
                response.end('data', data);
            })
            .catch(function (err) {
                response.end(err);
            })
    } else if (url == '/read') {
        fileOp.readFile('abcd.js', function (err, done) {
            if (err) {
                response.end(err);
            } else {
                response.end('done' + done);
            }
        })
    } else if(url == '/rename'){
        fileOp.rename('pinkfloyd.txt', 'tool.txt', function(err, done){
            if(err){
                response.end(err)
            }
            else{
                response.end('done', done)
            }
        })
    } else {
        response.end('form default page');
    }
    console.log('client connected to server');
    console.log('request url >>', request.url);
    // request response cycle must be completed
    // response.end('hi from node server'); response cannot sent more than once
});
server.listen(8080, function (err, done) {
    if (err) {
        console.log('server listening failed');
    }
    else {
        console.log('server listening at port 8080');
        console.log('press CTRL + C to exit from server');
    }
});

在代码的这一部分中:

    fileOp.rename('pinkfloyd.txt', 'tool.txt', function(err, done){
        if(err){
            response.end(err)
        }
        else{
            response.end('done', done)
        }

您正在调用response.end('done', done)。但是,fs.rename()回调没有done参数 - 它仅具有err参数,因为没有数据可以回传递 - 重命名的是成功或没有。因此,done将为undefined。所以您正在打电话:

 response.end('done', undefined);

response.end()的功能签名是:

 response.end([data[, encoding]][, callback])

因此,您正在尝试发送undefined以进行编码。那是不正确的。


您的重命名功能应与此更改:

function rename(oldname, newname, cb){
    fs.rename(`./bands/${oldname}`, `./bands/${newname}`, function(err,done){
        if(err){
            cb(err)
            return
        }
        cb(null,done)
    })
}

function rename(oldname, newname, cb){
    fs.rename(`./bands/${oldname}`, `./bands/${newname}`, function(err){
        if(err){
            cb(err);
            return
        }
        cb(null);    // no 2nd argument here
    })
}

甚至更简单:

function rename(oldname, newname, cb){
    fs.rename(`./bands/${oldname}`, `./bands/${newname}`, cb);
}

fyi,看来您正在使用.end()不当的代码中的一堆位置:

response.end('done', someData);    

那不是其工作方式。您没有发出活动。您正在指挥HTTP响应的结尾,需要遵循此功能签名:

response.end([data[, encoding]][, callback])

所以,如果data是字符串,您可能只做response.end(data)

相关内容

最新更新