文章目录
哈喽小伙伴们,新的专栏 Node 已开启;这个专栏里边会收录一些Node的基础知识和项目实战;今天带领大家初识一下 Node内置模块 http 模块;让我们一起来看看吧🤘
let http = require("http");
let server = http.createServer(function(req,res){
res.end();
})
server.listen(8000,()=>{})
响应的信息,告诉浏览器内容的类型,用什么方式去解析
res.writeHead(200,{
'Content-type':'text/html;utf8'
})
//导入http模块
var http = require('http');
//创建一个http服务器
var server = http.createServer(function (req,res) {//req请求 res响应
res.write('hello'); //向客户的发送数据 只能为字符串或Buffer
res.write('world');//向客户的发送数据
res.end();//发送结束
})
server.listen(8080); //监听指定端口号
| 属性 | 描述 |
|---|---|
| request.url | 客户端请求的url地址,如http://127.0.0.1/hello/world,那么request.url就是/hello/world |
| request.headers | 客户端请求的http header |
| request.method | 获取请求的方式,一般有几个选项,POST,GET和DELETE等,服务器可以根据客户端的不同请求方法进行不同的处理。 |
| 属性 | 描述 |
|---|---|
| res.writeHead | response.writeHead(statusCode, [reasonPhrase], [headers]) res.writeHead(200,{Content-Type:‘text/plain’}); |
| res.removeHeader(“Date”) | 从隐式发送的队列中移除一个响应头。 |
| res.setTimeout(msecs, callback) | 设置http超时返回的时间,一旦超过了设定时间,连接就会被丢弃 |
| res.statusCode | 设置返回的网页状态码 |
| res.setHeader(name, value) | 设置http协议头 |
| res.headersSent | 返回一个布尔值(只读)。 如果响应头已被发送则为 true,否则为 false。 |
| res.write(chunk, [encoding]) | 返回的网页数据,[encoding] 默认是 utf-8 |
| res.end([data], [encoding]) | 将设置的数据包,发送数据到客户端(完成响应)。 |
var http = require('http');
http.createServer(function (req,res) {
var d = new Date();
res.write(d.toString())
res.end();
}).listen(9000);
var http = require('http');
http.createServer(function (req,res) {
res.setHeader('Content-type','text/html,charset=utf-8');
res.write('你好,世界');
setTimeout(function () {
res.write('我不好,人类');
res.end();
},2000)
}).listen(9000);
var http = require('http');
var fs = require('fs');
var path = require('path');
var mime = require('mime');
http.createServer(function (req,res) {
var url = req.url;
console.log(url)
if(url=='/'){url='index.html'};
res.setHeader('Content-type',mime.lookup(url)+';charset=utf-8');
fs.readFile('./'+url,'utf8',function (err,data) {
res.write(data);
res.end();
})
}).listen(9001);
//导入核心模块
var http = require("http");
var fs = require("fs");
var url = require("url");
//模拟数据
var data = [
"你每天都很困,只因为你被生活所困",
"每天都在用六位数的密码,保护着两位数的存款",
"年纪越大,越没有人会原谅你的穷",
"全世界都在催你早点,却没人在意你,还没吃'早点'",
"小时候总骗爸妈自己没钱了,现在总骗爸妈,没事~我还有钱"
];
//创建服务器
var server = http.createServer(function(req,res){
var urlObj = url.parse(req.url,true);
if(req.url"/"||req.url"/index.html"){
fs.readFile("./index.html",function(err,data){
res.write(data);
res.end();
})
}
if(urlObj.pathname=="/search"){
var d = data.filter((val,index)=>{
return val.indexOf(urlObj.query.s)==-1?false:true;
});
res.write(JSON.stringify(d));
res.end();
}
})
//监听服务器
server.listen(3000);
//引入核心模块
var http = require('http');
//引用URL解析URL参数
var url = require('url');
//读写文件
var fs = require('fs');
var querystring = require('querystring');
//创建http服务器
//只有当提交form表单,并且是GET请求的时候,浏览器才会把表单进行序列化拼到URL后面
http.createServer(function(req,res){
//一定会返回一个对象
// true的话urlObj的query也会是一个对象,否则就是一个字符串
// username=zfpx&password=123 -> {username:'zfpx',password:123}
var urlObj = url.parse(req.url,true);
//路径名
var pathname = urlObj.pathname;
if(pathname == '/'){
//读取文件的内容
fs.readFile('./index.html','utf8',function(err,data){
res.end(data);
})
}else if(pathname == '/reg'){
var result='';
//当读到客户端提交过来的数据时会触发data事件,然后调用回调函数
req.on('data',function(data){
result +=data;
})
req.on('end',function(data){
var contentType = req.headers['content-type'];
if(contentType =='application/x-www-form-urlencoded'){
var obj = querystring.parse(result);
console.log(obj);
}else if(contentType == 'application/json'){
var obj = JSON.parse(result);
console.log(obj);
}
res.end('ok');
})
}else if(pathname == '/reg2'){
res.end('ok2');
}
}).listen(8080);
使用第三方包 formidable
var http = require('http');
var url = require('url');
var fs = require('fs');
var formidable = require('formidable');
var querystring = require('querystring');
var util = require('util');
var mime = require('mime');
// 构建一个解析器
var formParser = new formidable.IncomingForm();
///用解析器解析请求体
//把非file的input放在fields里
//把文件类型的元素放在files里
formParser.parse(req, function(err, fields, files) {
fs.readFile(files.avatar.path,function(err,data){
console.log(files.avatar);
var filename = '/imgs/'+files.avatar.name;
fs.writeFile('.'+filename,data,function(err){
res.writeHead(200,{'Content-Type':'text/plain'});
res.end(filename);
})
})
});
更多Node知识以及API请大家持续关注,尽请期待。各位小伙伴让我们 let’s be prepared at all times!
✨原创不易,还希望各位大佬支持一下!
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里