我正在编写一个简单的请求处理程序以返回一对CSS文件。使用fs.readFileSync,这很容易。但是,我很难使用异步版本的readFile完成相同的任务。下面是我的代码。将我的response.write()方法调用拆分到两个不同的回调中似乎是有问题的。有人可以指出我做错了什么吗?有趣的是,如果我将response.end()放在第一个else语句中,则此代码有效。但是,这产生了一个问题,即第二个css文件没有返回(因为response.end()已被触发)。
function css(response) {
response.writeHead(200, {"Content-Type": "text/css"});
fs.readFile('css/bootstrap.css', function(error, content){
if(error){
console.log(error);
}
else{
response.write(content);
}
});
fs.readFile('css/bootstrap-responsive.css', function(error, content){
if(error){
console.log(error);
}
else{
response.write(content)
}
});
response.end();
}
您所拥有的主要问题是立即response.end()
被致电。您只需在文件完成response.write
调用后调用它。
最简单的方法是使用控制流库。管理多个异步回调通常很复杂。
https://github.com/joyent/node/wiki/modules#wiki-async-
flow
我将使用异步库,因为它是我最了解的一个。
var fs = require('fs');
var async = require('async');
function css(response) {
response.writeHead(200, {"Content-Type": "text/css"});
async.eachSeries(
// Pass items to iterate over
['css/bootstrap.css', 'css/bootstrap-responsive.css'],
// Pass iterator function that is called for each item
function(filename, cb) {
fs.readFile(filename, function(err, content) {
if (!err) {
response.write(content);
}
// Calling cb makes it go to the next item.
cb(err);
});
},
// Final callback after each item has been iterated over.
function(err) {
response.end()
}
);
}
如果您想在没有库的情况下完成此工作,或者只是想用另一种方式,这就是我将更直接地做到这一点的方式。基本上,您保留a
count
并end
在两个文件读取完成后调用。
function css(response) {
response.writeHead(200, {"Content-Type": "text/css"});
var count = 0;
var handler = function(error, content){
count++;
if (error){
console.log(error);
}
else{
response.write(content);
}
if (count == 2) {
response.end();
}
}
fs.readFile('css/bootstrap.css', handler);
fs.readFile('css/bootstrap-responsive.css', handler);
}
我想Node.js读取form.html当域名localhost:3000/form,但由于某种原因,它总是给我一个错误500页。 fs.readFile的回调函数中的content参数未定义,即使文件的路径正确。 添加了错误消息: {[Error:enoint,打开'C:\form.html']errno:34,代码:'enoint',路径:'C:\form.html'} 我必须指定文件的完整路
问题内容: 我有一个数组,其中包含几个文件的URL。例如: 我需要异步读取它们并将它们保存在名为cache(cache = {})的对象中。为此,我使用了代码: 最后我得到了结果: 我确实了解,“ readFile”在循环结束后起作用,并且失去了作用域。有没有一种方法可以解决此问题,或者有另一种方法可以从数组中读取文件并对其进行缓存? 问题答案: 当您的要执行的回调执行时,for循环将已经完成。所
问题内容: 假设对于API的每个响应,我都需要将响应中的值映射到Web应用程序中的现有json文件,并显示json中的值。在这种情况下,读取json文件的更好方法是什么?require或fs.readfile。请注意,可能同时有成千上万的请求。 请注意,我不希望在运行时对文件进行任何更改。 问题答案: 我想您将JSON.parse JSON文件进行比较,在这种情况下会更好,因为它将立即解析该文件并
问题内容: 我需要在终端中传递一个文本文件,然后从中读取数据,我该怎么办? 如何从终端进入路径,如何在另一侧阅读? 问题答案: 您将要使用数组访问命令行参数以获取文件名,并使用FileSystem模块(fs)来读取文件。例如: 为了稍微分解一下,通常长度为2,第零个为“节点”解释器,第一个为节点当前正在运行的脚本,其后的项目在命令行中传递。从argv中提取文件名后,就可以使用文件系统函数读取文件并
我想使用一个BufferedReader对象从两个或多个文件中读取文本。