node.js - 如何在没有 Express 等的情况下“运行”HTML 网页
问题描述
我的问题可能与其他人非常相似,但我已经阅读了很多答案,但我并不完全了解它们背后的细节。
我必须创建一个 node.js REST API,但我之前没有上过任何课程。所以我目前正在阅读并尝试教程来学习创建一个简单的 node.js 脚本。
我安装了node.js,我创建了我的脚本(它只是读取一个输入字段),当我点击一个按钮时,它应该在控制台中写入输入。
本教程只需要 node.js,并使用 .createserver。我知道 node.js 是服务器端的,没有它就无法解释。本教程要求直接使用路径在浏览器中打开 .html 文件。显示 html 网页,但是...当我按“确定”时,出现以下错误:
*app.js:1 Uncaught ReferenceError: require is not defined
Access to XMLHttpRequest at 'file:///.../ApplicationAngular/nodeProject/app.html?name=' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
GET file:///.../ApplicationAngular/nodeProject/app.html?name= net::ERR_FAILED*
StackOverflow 上的所有线程都说明我需要第三方来运行 HTML 网页。但在教程中,一切正常,从未提及 Express、Cheerio 等的存在。
这是代码示例:app.html
<input type="text" placeholder="Enter your name" id="name"/>
<input type="button" value="OK" onclick="valid()"/>
<div id="message"></div>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script src="app.js"></script>
<script>
function valid() {
$.get('', { name: $('#name').val() }, function(data) {
$('#message').html(data.message);
}, 'json');
}
</script>
应用程序.js
var http = require('http');
var url = require('url');
var fs = require('fs');
var server = http.createServer(function (req, res) {
var url_parts = url.parse(req.url, true);
var name = url_parts.query.name;
if(name){
console.log('Nom: ' + name);
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(JSON.stringify({message: 'Hello' + name + ' !'}));
} else {
console.log('No name !');
res.writeHead(200, {'Content-Type': 'text/plain'});
fs.readFile('app.html', function (err,data)
{
res.end(data);
});
}
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
教程是否缺少某些内容?我必须安装 Express 才能查看网页吗?再次抱歉,英语不是我的母语。
非常感谢你的回答。
解决方案
在您的 html 中使用这一行
<script src="app.js"></script> <!-- wrong! -->
您尝试在浏览器的 javascript 解释器中运行您的 nodejs 程序。您需要在您的服务器上运行它。您的浏览器无法执行这些require()
操作,因为这些操作是在您服务器上的 nodejs 中工作的。
尝试从 html 中删除该行,并尝试在服务器的命令行上执行类似的操作,然后从浏览器访问 http://localhost:1337。
node app.js
浏览器和 nodejs 支持相同的语言这一事实有点令人困惑,因为你已经弄清楚了。语言相同,但两个运行时环境完全不同。要有耐心。你会明白的。
您向我们展示的app.js
nodejs 程序应该可以正常运行。在其if (name)
分支中,它处理来自$.get()
浏览器操作的请求。在其else
分支中,它将 html 文件传递给浏览器。
而且,不得不说,不仅仅是只用 nodejs 做这种教程——没有 express 或其他一些网络服务器框架——会成为 xxx 脖子上的一个巨大的痛苦,足以让你脖子上的痛苦会很想开发自己的框架。
编辑你有这行两次
res.writeHead(200, {'Content-Type': 'text/plain'}); /* wrong! */
将两个事件更改为
res.writeHead(200, {'Content-Type': 'text/html'});
标Content-Type: text/html
头告诉您的浏览器将您的 html 文件解释为 html,而不是原始文本。
推荐阅读
- keyboard - MPLAB 不接受来自键盘的某些字符
- bash - 无法使用 terraform 外部数据解析 JSON
- r - 使用 rhandsontable 和 reactiveValues 时使闪亮更快的方法
- sockets - LTE 上的 UDP 流量
- wordpress - 如何修复 wordpress 中无响应的特色框?
- python - RELU 反向传播
- java - 使用 Java 函数式编程简化 if-else 条件
- excel - 根据另一个值和范围查找值
- angularjs - 角度错误 403:预检响应没有 HTTP ok 状态
- java - WeakHashMap 是在不断增长,还是清除了垃圾键?