express 如何实现请求转发
发布于 13 年前 作者 yiqianke 54061 次预览 最后一次回复是 10 年前 来自
前端ajax进入nodejs,nodejs如何发送ajax到某台服务器? 代码如下,搞不清为什么app.get是可以的,app.post没有反应。http.request 里面都没有执行。
//routes.js
var sign = require('/sign');
//这个是 OK的
app.get('/api/getUser', function(req,res){
sign.find(req,function(res,data){
res.render('ruleConfig.html',{user:data});
})
})
//这个没反应
app.post('/api/getUser', function(req,res){
sign.find(req,function(res,data){
res.contentType('json');
res.write(JSON.stringify(data));
res.end();
})
})
//sign.js
var http = require('http');
exports.find = function(req,success){
var headers = req.headers;
headers.host = 'www.xxx.com';
var options = {
host: 'www.xxx.com',
port: 80,
path: '/getUser',
method: 'GET',
headers: headers
};
var req = http.request(options, function(res) {
res.setEncoding('utf8');
res.on('data', function (data) {
var data = JSON.parse(data);
success(res,data);
});
});
req.on('error', function(e){
console.log("auth_user error: " + e.message);
});
req.end();
}
20 回复
少了个括号: res.write(JSON.stringify(data);
嗯,这只是个简单的例子便于解释我的问题。已经更正了。请问真正导致不能转发的原因在哪里?
我提议两个方法给你试试
@yiqianke
问题出在这里: success(res,data); 你里面的 res 不应该用在外面。 我很怀疑你的 get 可用。我的调好的例子在下面。
hellosign.js
@leapon 非常感谢您的帮助,不过用了您的例子还是和我的问题一样,get可以通过,但是把form表单里的提交方式改成post就会得不到结果。是不是要改header信息?
@yiqianke 我的测试通过。你用我的代码试了吗?
@leapon @alvis接收页面post请求的时候的头部带了content-length属性。但是转发的时候又用的是get方法。去掉这个属性就搞定了。但是觉得这样处理不妥。有没有好办法?
@leapon
delete headers['content-length'];@yiqianke 难道是 post 不带 content-length 属性。 post 的内容和头部是分开的,所以没有 content-length 属性?有点道理。不确切。
不错。这个就是我想要的,多谢
@leapon 搞反了。POST请求才需要 content-length 属性,否则服务器不知道什么时候才接收完数据。 因为请求头是通过 \r\n\r\n 来表示结束的,剩下的POST数据木有结束标志,只能通过content-length来确定。
@leizongmin 赞 学习
利用pipe处理转发是最简单的
@leizongmin 很有参考意义,解决了我很多疑问
@leizongmin 你好,使用pipe做下载时要怎么处理啊? 服务端返回的是二进制文件,经过pipe传到前端的文件是一个乱码的文件,这个要怎么处理编码的问题?
@zfeidy 文件是什么样的内容?举个例子
@leizongmin 已经弄好了,之所以乱码是因为有
这句话,去掉就OK。不过要实现代理上传的话感觉还是蛮麻烦的!我做了一个感觉不太好,需要使用node服务器中转一次,这样效率就低了。你有好的思路吗?
mark
@leizongmin mark 老雷的代码,老早了~