或许是愚蠢的问题。
我最近一直在玩Node.js,并且喜欢设置服务器和发出请求等等是多么容易。我还没有尝试过,但我想知道如何从一个转发数据请求到另一台服务器,让第二台服务器向客户端发送响应。
这可能吗?
即
CLIENTX - >服务器A - >服务器B - >客户端X
让我困惑的是如何发送给同一个客户?这个信息应该出现在请求头中但是没有?是将这些信息转发给服务器B吗?
我正处于接受Node.js服务器上的请求的情况,并希望将一些数据转发到我创建的Laravel API并将响应发送到那里的客户端表单。
感谢您的回答,
马特
答案 0 :(得分:2)
使用request
模块非常容易。
这是"服务器A"的一个示例实现,它将按原样将所有请求传递给服务器B,并将其响应发送回客户端:
@Entity
public class Resolution {
public static final int serialId = 106;
private int id;
private Integer height;
private Integer width;
private Type typeId;
private Collection<Smartphone> resolutionId;
@Id
@Column(name = "id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Basic
@Column(name = "height")
public Integer getHeight() {
return height;
}
public void setHeight(Integer height) {
this.height = height;
}
@Basic
@Column(name = "width")
public Integer getWidth() {
return width;
}
public void setWidth(Integer width) {
this.width = width;
}
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "type_id", referencedColumnName = "id", nullable = false)
public Type getTypeId() {
return typeId;
}
public void setTypeId(Type typeId) {
this.typeId = typeId;
}
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "resolutionId")
public Collection<Smartphone> getResolutionId() {
return resolutionId;
}
public void setResolutionId(Collection<Smartphone> resolutionId) {
this.resolutionId = resolutionId;
}
}
您可以使用http
模块实现此功能,而不是'use strict';
const http = require('http');
const request = require('request').defaults({ followRedirect : false, encoding : null });
http.createServer((req, res) => {
let endpoint = 'http://server-b.example.com' + req.url;
req.pipe(request(endpoint)).pipe(res);
}).listen(3000);
,但request
可让您更轻松。
对request
的任何请求都将以相同的路径(+方法,查询字符串,正文数据等)传递给服务器B.
http://server-a.example.com/some/path/here
和followRedirect
是我在将请求传递给其他服务器时发现有用的两个选项。它们记录在案here。
答案 1 :(得分:1)
正如已经提到的,它并不像那样。 服务器B 无法将响应发送回客户端X ,因为这将作为对NO REQUEST的响应。 客户端X 从未向服务器B 询问任何内容。
以下是其工作原理:
示例实施:
var http = require('http');
function onRequest(request, response) {
var options = {
host: 'stackoverflow.com',
port: 80,
path: '/'
};
var body = '';
http.get(options, function(responseFromRemoteApi) {
responseFromRemoteApi.on('data', function(chunk) {
// When this event fires we append chunks of
// response to a variable
body += chunk;
});
responseFromRemoteApi.on('end', function() {
// We have the complete response from Server B (stackoverflow.com)
// Send that as response to client
response.writeHead(200, { 'Content-type': 'text/html' });
response.write(body);
response.end();
});
}).on('error', function(e) {
console.log('Error when calling remote API: ' + e.message);
});
}
http.createServer(onRequest).listen(process.env.PORT || 3000);
console.log('Listening for requests on port ' + (process.env.PORT || 3000));