- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
了解node.js和socket.io并通过this tutorial by Daniel Nill进行工作。服务器启动没有问题。但是,当我导航到localhost:8001 / socket.html时,会收到默认错误消息。因此,我将switch语句更改为“ /socket.html”,而不是“ socket.html”。现在,该页面加载状态代码200,但没有任何内容呈现到屏幕上。屏幕上应该显示“这是我们的socket.html文件”。是什么赋予了?
服务器端js代码是
var http = require("http");
var url = require('url');
var fs = require('fs');
var server = http.createServer(function(request, response){
console.log('Connection');
var path = url.parse(request.url).pathname;
switch(path){
case '/':
response.writeHead(200, {'Content-Type': 'text/html'});
response.write('hello world');
break;
case 'socket.html':
fs.readFile(__dirname + path, function(error, data){
if (error){
response.writeHead(404);
response.write("opps this doesn't exist - 404");
}
else{
response.writeHead(200, {"Content-Type": "text/html"});
response.write(data, "utf8");
}
});
break;
default:
response.writeHead(404);
response.write("opps this doesn't exist - 404");
break;
}
response.end();
});
server.listen(8001);
<html>
<head></head>
<body>This is our socket.html file</body>
</html>
最佳答案
初学者在这里。据我所知,丹尼尔·尼尔(Daniel Nill)为教程编写了很多代码,但从未成功。结果,他使初学者更加困惑-他声称这是他想缓解的事情。
因此,我将switch语句更改为“ /socket.html”,而不是“ socket.html”。
那是一个明显的错误-不错的收获。
现在,该页面的状态代码为200,但没有任何内容呈现给
屏幕。屏幕上应该显示“这是我们的socket.html文件”。什么
给?
或者,就像我看到的那样,如果socket.html文件不存在,则不会得到404错误,而是得到状态码200(确定)和一个空网页。
本教程中的代码不起作用的原因是因为Daniel Nill认为自己会很聪明并且不会在每个response.end()
之后写response.write()
。他以为自己可以在所有代码的末尾写一个response.end()
。
在我看来,Daniel Nill误解了nodejs的工作方式。也就是说,nodejs不会执行一个函数,然后等待作为参数传递的处理程序函数在执行下一行代码之前完成执行。如果nodejs确实做到了,那么我们就不需要将代码放入处理函数中。相反,nodejs将处理程序功能添加到将来要在某个时间执行的处理程序功能列表。
查看这段代码中的fs.readFile()函数:
switch(path){
case '/':
response.writeHead(200, {'Content-Type': 'text/html'});
response.write('hello world');
break;
case 'socket.html':
fs.readFile(__dirname + path, function(error, data){
if (error){
response.writeHead(404);
response.write("opps this doesn't exist - 404");
}
else{
response.writeHead(200, {"Content-Type": "text/html"});
response.write(data, "utf8");
}
});
break;
default:
response.writeHead(404);
response.write("opps this doesn't exist - 404");
break;
}
response.end();
function(error, data){
if (error){
response.writeHead(404);
response.write("opps this doesn't exist - 404");
}
else{
response.writeHead(200, {"Content-Type": "text/html"});
response.write(data, "utf8");
}
});
/socket.html
时,nodejs执行
fs.readFile()
,然后nodejs将其处理函数添加到等待执行的处理函数列表中,然后nodejs继续运行。将执行的下一行代码是
response.end()
此处:
default:
response.writeHead(404);
response.write("opps this doesn't exist - 404");
break;
}
response.end(); //<====HERE ******
response.end()
。
response.end()
的文档:
response.end()
,则nodejs将创建一个状态码为200的空响应,例如:
switch(path) {
case '/':
//resp.writeHead(200, {'Content-Type': 'text/html'} );
//resp.write('<h3>Root page</h3>');
resp.end();
break;
var http = require('http');
var url = require('url');
var fs = require('fs');
var server = http.createServer(function(requ, resp) {
//requ.url => everything after the host--including the query string
//url.parse(requ.url).pathname => the portion of requ.url before the query string
var path = url.parse(requ.url).pathname;
//The following is so that the automatic request that all browsers make
//for favicon.ico (which for some reason is not logged by any developer
//tools) will not display a 'connection' message:
if (path == '/favicon.ico') {
resp.writeHead(200, {'Content-Type': 'image/x-icon'} );
resp.end();
return; //Terminate execution of this function, skipping the code below.
}
//Router:
switch(path) {
case '/':
resp.writeHead(200, {'Content-Type': 'text/html'} );
resp.write('<h3>Root page</h3>');
resp.end();
break;
case '/socket.html':
fs.readFile(__dirname + path, function(error, data) {
if (error) {
console.log('file error');
resp.writeHead(404);
resp.write("oops, this doesn't exist - 404");
resp.end();
}
else {
console.log('no file error');
resp.writeHead(200, {'Content-Type': 'text/html'} );
resp.write(data, 'utf8');
resp.end();
}
});
break;
default:
resp.writeHead(404);
resp.write("oops, this doesn't exist - 404");
resp.end();
break;
}
console.log('Connection');
});
port = 8888;
console.log('Server listening on port ' + port);
server.listen(port);
response.end()
的次数,可以执行以下操作:
var http = require('http');
var url = require('url');
var fs = require('fs');
var server = http.createServer(function(requ, resp) {
//console.log('request url: ' + requ.url);
//requ.url => everything after the host--including the query string
//url.parse(requ.url).pathname => the portion of requ.url before the query string
var path = url.parse(requ.url).pathname;
//The following is so that the automatic request that all browsers make
//for favicon.ico (which for some reason is not logged by any developer
//tools) will not cause a 'connection' message:
if (path == '/favicon.ico') {
resp.writeHead(200, {'Content-Type': 'image/x-icon'} );
resp.end();
return;
}
//Router:
switch(path) {
case '/':
resp.writeHead(200, {'Content-Type': 'text/html'} );
resp.write('<h3>Root page</h3>');
resp.end();
break;
case '/socket.html':
fs.readFile(__dirname + path, function(error, data) {
if (error) {
console.log('file error');
resp.writeHead(404);
resp.write("oops, this doesn't exist - 404");
//resp.end();
}
else {
console.log('no file error');
resp.writeHead(200, {'Content-Type': 'text/html'} );
resp.write(data, 'utf8');
//resp.end();
}
resp.end();
});
break;
default:
resp.writeHead(404);
resp.write("oops, this doesn't exist - 404");
resp.end();
break;
}
//resp.end();
console.log('Connection');
});
port = 8888;
console.log('Server listening on port ' + port);
server.listen(port);
response.end()
,就像Daniel Nill所做的那样。并且您不能在switch语句后放置
response.end()
,因为
response.end()
将在传递给fs.readFile()的处理程序函数执行之前执行,这将导致状态值为200的空请求发送到浏览器。
http://localhost:8888/
/favicon.ico
。您可以通过编写类似以下内容来证明是这种情况:
var server = http.createServer(function(requ, resp) {
console.log('request url: ' + requ.url);
if (path == '/favicon.ico') {...
$ DEBUG=socket.io:* node server.js
Log differences
部分:
server.js
中添加了以下内容:
var http = require('http');
var url = require('url');
var fs = require('fs');
var io = require('socket.io'); //New code
var server = http.createServer(function(requ, resp) {
...
...
...
});
port = 8888;
console.log('Server listening on port ' + port);
server.listen(port);
//New code:
var websockets_listener = io.listen(server);
websockets_listener.sockets.on('connection', function(socket){
socket.emit('server message', {"message": "hello world"});
});
socket.html
中,我有这个:
<html>
<head>
<script src="/socket.io/socket.io.js"></script>
</head>
<body>
<div>This is our socket.html file</div>
<div id="message"></div>
<script>
var socket = io.connect();
//More recent versions of socket.io allow you to simply write:
//var socket = io();
//which both creates the socket and by default connects to
//the same host that served this page.
//See: http://socket.io/get-started/chat/, section Integrating Socket.IO
socket.on('server message', function(data) {
document.getElementById('message').innerHTML = data.message;
});
</script>
</body>
</html>
socket.on('server message', function(data) {
console.log(data.message);
});
server.js
中执行此操作:
var websockets_listener = io.listen(server);
websockets_listener.sockets.on('connection', function(socket){
setInterval(function() {
var now = new Date();
socket.emit('time', {local_time: now.toLocaleTimeString()})
}, 1000);
});
socket.html
:
<html>
<head>
<script src="/socket.io/socket.io.js"></script>
</head>
<body>
<div>This is our socket.html file</div>
<div id="message"></div>
<script>
var socket = io.connect();
socket.on('time', function(data) {
document.getElementById('message').innerHTML = data.local_time;
});
</script>
</body>
</html>
socket.html
:
<html>
<head>
<script src="/socket.io/socket.io.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.js"></script>
</head>
<body>
<div>This is our socket.html file</div>
<div id="time"></div>
<textarea id="text"></textarea>
<script>
var socket = io.connect();
socket.on('time', function(data) {
$('#time').html(data.local_time);
});
//Because the html above has already been parsed by the time this
//js executes, there is no need for document.ready():
$('#text').on('keypress', function(event) {
var keycode = event.which;
socket.emit('client data', {letter: String.fromCharCode(keycode)} );
});
</script>
</body>
</html>
server.js
:
var http = require('http');
var url = require('url');
var fs = require('fs');
var io = require('socket.io');
var server = http.createServer(function(requ, resp) {
...
...
...
});
port = 8888;
console.log('Server listening on port ' + port);
server.listen(port);
var websockets_listener = io.listen(server);
//websockets_listener.set('log level', 1);
//Rather than writing the previous line(which doesn't work anymore)
//just stop the server and restart it using this command:
//$ node server.js
//...instead of:
//$ DEBUG=socket.io:* node server.js
websockets_listener.sockets.on('connection', function(socket){
setInterval(function() {
var now = new Date();
socket.emit('time', {local_time: now.toLocaleTimeString()})
}, 1000);
socket.on('client data', function(data) {
process.stdout.write(data.letter);
});
});
关于node.js - HTTP状态码200,但页面无法加载Node.js Socket.io —带有Socket.io,Daniel Nill,fs.readFile(),socket.html的Node.js教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20363617/
我正在尝试将我的Node.js项目迁移到Bun。我的项目在很多地方使用了‘fs’包。我发现了许多Bun迁移示例,它们将‘fs’包导入为‘node:FS’。但是,作为“文件系统”导入可以很好地工作,没有
我正在尝试将我的Node.js项目迁移到Bun。我的项目在很多地方使用了‘fs’包。我发现了许多Bun迁移示例,它们将‘fs’包导入为‘node:FS’。但是,作为“文件系统”导入可以很好地工作,没有
我正在使用 aws lambda。 我有一个 .p8 文件,用于发送 apns 通知。因为我不能使用相对或绝对路径,因为它没有服务器。我必须从 s3 url 读取它。为此我做了这个 let file
我相信以下所有命令都可用于将 hdfs 文件复制到本地文件系统。有什么区别/情境利弊。 (这里是 Hadoop 新手)。 hadoop fs -text /hdfs_dir/* >> /local_d
这是一个新手问题,但我有点困惑为什么需要 open 与 r 、 w 、 a 以及这些标志的所有变体。如果他/她想读取或写入文件而不是使用 open,难道不应该简单地使用 readFile 或 writ
我想在 JavaScript 中使用 import fs from 'fs'。这是一个示例: import fs from 'fs' var output = fs.readFileSync('som
我的公司正在执行 SVN 存储库迁移,我想避免两个存储库(目前都处于事件状态)之间的修订号重叠。 我的要求是将新存储库的修订强制为特定的修订号(例如:100.000)。 通过分析 FSFS 存储库,我
-put和-copyFromLocal被记录为相同,而大多数示例使用详细的变体-copyFromLocal。为什么? -get和-copyToLocal相同 最佳答案 copyFromLocal与pu
我正在调用 Google 云端硬盘的下载 API,然后我想使用 fs.writeFile 或 fs.writeFileSync 在本地写入下载的文件。这就是我正在做的事情: const wri
我正在学习一些教程,但无法理解为什么这一行“self.only_dirs.push(files[i]);”导致有关它“未定义”的错误。这肯定是一个变量范围问题,但我尝试过的都没有成功。我需要如何声明变
我是第一次尝试 phantomJS,我已经成功地从站点中提取了 som 数据,但是当我尝试将一些内容写入文件时,我收到错误:ReferenceError:找不到变量:fs 这是我的脚本 var pag
这是一个 Node 应用程序,运行 Express 服务器。我有一个包含文本文件的文件夹。我需要能够进入文件夹内的每个文件,并提取包含单词“SAVE”的行。 我被困在这一步了。 app.get('/l
我在 fs.chunks 中有 10 GB 的数据,我想删除不在 fs.files 上的所有文档。我已经删除了我不想要的 fs.files 中的每个条目,所以 fs.files 中的每个 id 都是我
我注意到官方 Node 文档对 fs.exists 的描述令人吃惊: "fs.exists() is an anachronism and exists only for historical rea
我用 require("fs").promises只是为了避免使用回调函数。 但是现在,我也想用fs.createReadstream使用 POST 请求附加文件。 我怎样才能做到这一点? 或者在这种
我正在使用 Electron 和 React 编写桌面应用程序。我想将一些信息存储在 JSON 文件中。我试过 web-fs 和 browserify-fs 来完成这个,但都没有按预期工作。我的设置如
其中哪一个更适合在 Node 服务器应用程序的文件管理器类型中处理文件读/写操作? 一个比另一个快吗?速度非常重要,因为该应用程序应该能够同时处理许多用户请求 最佳答案 流的独特之处在于,不是程序像传
我需要递归或不递归地遍历文件夹(给定 bool 参数)。我发现有 fs::recursive_directory_iterator() 和 fs::directory_iterator()。在 Jav
AFAICT,如果我正在编写一个库并使用 Promise.promisifyAll(fs);,这会修改 fs 模块(而不是返回修改后的复制)。因此,如果有人导入我的库,这也会对他们修改 fs 产生副作
我正在使用带有以下导入代码的 fs 模块 导入 fs = require('fs') 代码一直运行,直到在下面的 TypeScript 代码的第二行遇到此异常 const filePath = 'da
我是一名优秀的程序员,十分优秀!