gpt4 book ai didi

javascript - 请求结束后nodejs写入错误

转载 作者:行者123 更新时间:2023-12-03 07:53:05 25 4
gpt4 key购买 nike

我在nodejs中遇到请求结束后写入的问题:我有一个 server.js 文件,它将请求发送到其他 js 文件(例如 abc.js),后者将响应发送回 server.js 文件,然后 server.js 文件写入响应,然后结束响应。

我的问题是,如果我在 abc.js 中编写响应并在那里结束它,那么它就可以正常工作,但如果它在 sererconf.js 中,则不能。

让我明确一下,只有当我一次发送 20-30 个请求时才会出现此错误。我想知道其背后的逻辑,我搜索了很多,但没有找到好的答案,任何帮助将不胜感激。

    server.js full code:

/* create HTTP server */
var httpd = http.createServer(function(req, res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.writeHead(200, {"Content-Type" : "application/json"});
}).listen(3800);

/* send request to the file mentioned in url*/
httpd.on('request', function(req, res) {
urll = __dirname + '/..' + req.url;

fs.exists(urll, function (exists) {
if(exists){
var server = require(urll);
server.get(req,res);
}
});

module.exports = {
result : function(result){
if(Array.isArray(result)){
for(var key in result){
result[key] = JSON.parse(result[key]);
}
}

result = JSON.stringify(result);
res.write(result ,function(err) { if(!err) res.end(); });
},
};
});


**apps.js code**:

var constants = require('./lib/constant.js');
var APP_PATH = constants.APP_PATH;
module.exports = {

get : function(req) {
req.on('data', function(chunk) {

var hash = chunk;
hash = JSON.parse(hash);
var id = hash.id;

dirPath = APP_PATH + id;

fs.exists( dirPath, function (exists) {
if(exists)
read_app_dir(dirPath);
else
taskDone([]);
});

});
}
};

function read_app_dir(app_dir){
fs.readdir(app_dir,function(err, list){
if (err) {
httpd.log.info('cannot read apps dir at s_apps = '+err);
}else{
create_new_obj(list,app_dir);
}
});

}

function create_new_obj(list, app_dir){
appFilesObj = [];
var i = 0;

list.forEach(function(file) {
i=i+1;

file = app_dir +'/' +file;
appFilesObj.push(file);

if(i == Object.keys(list).length)
read_app_files(appFilesObj);
});
}

function read_app_files(appFilesObj,app_dir){
var apps = [];
var i = 0;

if(Object.keys(appFilesObj).length > 0){
appFilesObj.forEach(function(appfile) {
read_file(appfile,function(data){ i=i+1;
apps.push(data);
if(i == Object.keys(appFilesObj).length)
taskDone(apps);
});
});
}else{
taskDone([]);
}
}


function read_file(file,callback){
fs.readFile(file,'utf8', function (err, data) {
if (err)
httpd.log.info('cannot read file at s_apps = '+err);
else
callback(data);
});
}

function taskDone(apps){
var httpd = require(__dirname + '/server.js');
httpd.result(apps);
}

如果我在taskDone()的这个文件中执行res.write和res.end,那么它就可以正常工作。

提前致谢:)

最佳答案

上面代码的问题是,我通过调用 server.js 的导出函数发回响应 像这样:

var httpd = require(__dirname + '/server.js');
httpd.result(apps);

其中 result() 是我在 server.js 中导出的用于写入响应和结束响应的函数

取而代之的是,现在我在调用其他文件(ex-apps.js)的函数时添加了回调支持,这样只有当实际调用的函数给出时我才“res.write”和“res.end()”返回响应。(我没有编写完整的代码,请参阅上面的代码以了解两者的区别) httpd.on('请求', 函数(req, res) { url = __dirname + '/..' + req.url;

    fs.exists(urll, function (exists) {
if(exists){
var server = require(urll);
server.get(req,res,function(result){
res.write(result);
res.end();
});
}
});

**apps.js**


get : function(req, callback) {
req.on('data', function(chunk) {
//when task is done and taskDone() function is called I just callback() the result
function taskDone(result){
callback(result);
}
}
}

当我通过调用 server.js 的函数发送结果然后写入响应时......我不知道如何......但不知何故服务器在多个请求中感到困惑并说“结束后写入”错误...而结束是根据其他用户的请求调用的。

我可能是错的,但这就是我的结论:)我希望这可以帮助其他人。

关于javascript - 请求结束后nodejs写入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34924773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com