node.js - 我在 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);
}
仅供参考,您似乎.end()
在您的代码中不正确地使用了一堆地方来执行此操作:
response.end('done', someData);
这不是它的工作原理。您没有发出事件。您正在命令结束 http 响应,您需要遵循此函数签名:
response.end([data[, encoding]][, callback])
response.end(data)
所以,如果data
是一个字符串,你可能会这样做。
推荐阅读
- html - 事件绑定、属性绑定和双向数据绑定是否与 DOM 或模板有关?
- angular - 无法删除内容类型标题 angular8
- java - 如何使用 java @Configuration Spring 配置以过滤模式运行球衣
- ios - 了解将 facebook 登录添加到 iOS 应用程序的流程
- python - QComboBox 添加粗体父项
- tfs - Artifactory:TFS 发布任务不会下载,但相应的 jfrog-cli 命令工作正常
- npm - Np 跳过草稿发布步骤
- reactjs - 在 nx 工作区中创建反应应用程序失败 - 找不到纱线
- oracle - 如何为 dotNET 核心控制台应用程序设置 Oracle 连接字符串?
- java - 使用反斜杠为字符串中的特殊字符添加前缀