首页 > 解决方案 > 我在 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');
    }
});

标签: node.js

解决方案


在这部分代码中:

    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参数,因为没有数据可以回传——重命名要么成功,要么没有。所以,doneundefined。所以你打电话:

 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);
}

仅供参考,您似乎.end()在您的代码中不正确地使用了一堆地方来执行此操作:

response.end('done', someData);    

这不是它的工作原理。您没有发出事件。您正在命令结束 http 响应,您需要遵循此函数签名:

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

response.end(data)所以,如果data是一个字符串,你可能会这样做。


推荐阅读