Node.js出现resource is not passed错误:回调转发HTTP资源至网页失败
解决「resource is not passed」问题的分析与修复
先梳理下你代码里的几个关键问题,这些大概率是触发「resource is not passed」报错的核心原因:
代码里的明显问题
- 不完整的
res.end...:响应没有正确结束,会导致请求挂起,资源无法正常传递给后续逻辑 - HTML标签不必要的转义:你用了
<html>这类转义字符,会让浏览器把标签显示成纯文本而非解析成HTML结构,应该直接写<html> - 回调与响应结束的顺序冲突:如果你的
callback是异步操作(比如读取目录/文件),当前代码里res.end会在回调完成前执行,导致响应提前关闭,资源无法被回调正确利用
修正后的示例代码
假设你的LookDirs函数里的回调是用来读取目录内容并写入响应,这里调整了逻辑,确保响应在回调处理完成后再结束,同时正确传递res资源:
var http = require('http'); var fs = require('fs'); var Path = require('path'); function LookDirs(server, port, callback) { http.createServer(function (req, res) { res.setHeader("Content-Type", "text/html"); res.writeHead(200); res.write('<html><head><title>Simple Server</title></head>'); res.write('<body> Test1'); // 传递res给回调,同时传入一个done函数控制响应结束时机 callback('..', res, function() { res.write('</body></html>'); res.end(); }); }).listen(port); } // 示例回调函数:读取目录并把内容写入响应 function dirCallback(dirPath, res, done) { fs.readdir(dirPath, function(err, files) { if (err) { res.write('<p>读取目录出错: ' + err.message + '</p>'); done(); return; } res.write('<p>目录内容:</p><ul>'); files.forEach(file => { res.write(`<li>${file}</li>`); }); res.write('</ul>'); // 目录内容写入完成后,调用done结束响应 done(); }); } // 启动服务器,监听3000端口 LookDirs(null, 3000, dirCallback);
关键修复点
- 正确传递并使用res资源:确保回调函数接收
res参数,并且在回调内部直接操作这个响应对象写入内容 - 异步流程控制:如果回调涉及异步操作(比如文件IO),通过额外的
done回调函数来控制响应结束的时机,避免响应提前关闭 - 完整的响应结束:确保
res.end()被正确调用,且在所有内容写入完成后执行
这样调整后,响应对象(resource)就能被正确传递到回调函数中,「resource is not passed」的问题应该就能解决了。
内容的提问来源于stack exchange,提问作者Laki
相关产品推荐
相关产品推荐

