如何创建一个非常简单的node.js服务器,它本身会发出HTTP请求?
我发现了使用“http”模块创建服务器并显示字符串的非常简单的代码。 例如,来自: 我发现了使用“get”模块通过HTTP获取数据的非常简单的代码。 例如,来自:如何创建一个非常简单的node.js服务器,它本身会发出HTTP请求?,node.js,http,asynchronous,npm,async-await,Node.js,Http,Asynchronous,Npm,Async Await,我发现了使用“http”模块创建服务器并显示字符串的非常简单的代码。 例如,来自: 我发现了使用“get”模块通过HTTP获取数据的非常简单的代码。 例如,来自: const-got=require('got'); (异步()=>{ 试一试{ const response=wait got('https://www.nodesource.com/'); console.log(response.body); //=> ' ...' }捕获(错误){ console.log(error.respo
const-got=require('got');
(异步()=>{
试一试{
const response=wait got('https://www.nodesource.com/');
console.log(response.body);
//=> ' ...'
}捕获(错误){
console.log(error.response.body);
//=>“内部服务器错误…”
}
})();
但是,我无法将这两者集成起来创建一个服务器,当访问该服务器时,它会进行HTTP调用并返回结果。本质上,我只想替换var body='惊人的使用node.js的轻量级Web服务器\n'来自Gary Woodfine示例的代码>行以及Nodesource示例的输出
我并不是特别想了解为什么我想做这样的事情,我只是想从根本上理解为什么我不能做一件感觉非常简单和自然的事情:基于服务器端请求将内容返回给另一个web服务。我得到的印象是,问题与异步范例有关,显然,我了解它提供的性能改进,但我无法理解如何构建适用于此简单用例的东西。感谢他的帮助,我现在有了集成两个示例的代码:
var http = require('http');
const got = require('got');
var server = http.createServer(function (req, res) {
var body = (async () => {
try {
const response = await got('https://www.nodesource.com/');
var body = response.body;
var content_length = body.length;
res.writeHead(200, {
'Content-Length': content_length,
'Content-Type': 'text/plain' });
res.end(body);
//=> '<!doctype html> ...'
} catch (error) {
console.log(error.response.body);
//=> 'Internal server error ...'
}
})();
});
server.listen(3939);
console.log('Server is running on port 3939');
var http=require('http');
const-got=require('got');
var server=http.createServer(函数(req,res){
var body=(异步()=>{
试一试{
const response=wait got('https://www.nodesource.com/');
var body=response.body;
var content_length=body.length;
文书标题(200{
“内容长度”:内容长度,
“内容类型”:“文本/普通”});
决议结束(正文);
//=> ' ...'
}捕获(错误){
console.log(error.response.body);
//=>“内部服务器错误…”
}
})();
});
听(3939);
log('服务器正在端口3939上运行');
很明显,这段代码可以进一步简化,达到我心目中的那种简单程度
我出错的地方是在异步块之后尝试处理所有的http
响应代码,而我需要在异步块内部处理这些代码。如果您在第二个示例中简单地复制这些代码,并将其粘贴到第一个示例中的请求处理程序中,您将完成99%的操作。然后,您将使用res.end(response.body)
,而不是console.log(response.body)
。(当然,除非您知道长度是多少,否则您会希望读取内容长度标题,或者希望从其他响应中转达该长度。)嗨,Brad,非常感谢您的帮助,现在已解除阻止。让我大吃一惊的是,编码的响应需要嵌套在await
中,这正是我在异步中没有掌握的东西。我将添加我对代码的集成作为您的答案,如果您希望将您的注释更改为代码示例中的答案正文
,我将删除该注释。这有点棘手,但实际上它将是一个承诺
,通过调用异步函数隐式创建。有几种方法可以解决这个问题。最简单的方法是将async
关键字添加到函数(req,res)
,然后完全删除该额外的闭包。此外,我建议不要记录服务器正在侦听的日志,直到它完成。最好的方法是这样做:server.on('listening',()=>{console.log('listening',server.address());})
这样,您就知道server.listen()
是否成功了,以后如果更改端口号,您就不必担心更新端口号了。非常感谢。是的,第5行中被称为“主体”的东西是整合两个样本的遗留问题,而第8行中的那个可能是一个实际的响应主体。谢谢你提供的关于监听处理的提示。我认为我需要在node.js中进行一个实际的结构化课程,以建立一个工作流,其中很明显所有涉及的类型都是明显的错误处理很好,HTTP头很有用,而且可能会变得更简单,但这是我最初想到的简单性:var HTTP=require('HTTP');const-got=require('got');var server=http.createServer(异步函数(req,res){const response=wait get('https://example.com);res.end(response.body);});听(3939)代码>
const got = require('got');
(async () => {
try {
const response = await got('https://www.nodesource.com/');
console.log(response.body);
//=> '<!doctype html> ...'
} catch (error) {
console.log(error.response.body);
//=> 'Internal server error ...'
}
})();
var http = require('http');
const got = require('got');
var server = http.createServer(function (req, res) {
var body = (async () => {
try {
const response = await got('https://www.nodesource.com/');
var body = response.body;
var content_length = body.length;
res.writeHead(200, {
'Content-Length': content_length,
'Content-Type': 'text/plain' });
res.end(body);
//=> '<!doctype html> ...'
} catch (error) {
console.log(error.response.body);
//=> 'Internal server error ...'
}
})();
});
server.listen(3939);
console.log('Server is running on port 3939');