nodejs请求处理

日期:2016-2-16 19:21 | 标签: nodejs请求 前端技术 | 阅读:674

今天有涉及到nodejs请求处理,把一些细节处理记录在这里,node在这里起中间层的作用,接受微信网页客户端与App客户端的请求。

请求跨域

// 全部请求支持跨域
app.all('*', function(req, res, next) {
    // 支持所有域
    res.header("Access-Control-Allow-Origin", "*");
    // 这里还可以加上自定义头部,如yourHeaderFeild
    res.header("Access-Control-Allow-Headers", "X-Requested-With,yourHeaderFeild");
    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By",' xx-nodejs-server');
    res.header("Content-Type", "application/json;charset=utf-8");
    next();
});

参数获取

// 路由参数获取,形式如: baseurl/user/:id
req.params.参数名
// 查询字符串, 形式如: baseurl?id=12
req.query.参数名
// urlencoded方式(表单、post ), 形式如: id=12&name=pengyi
req.body.参数名

我使用AngularJS中的$httpProvider发起请求,后端无法直接获取,需要对请求进行转化,具体参见我的这篇文章 get/post数据至.Net后台
值得注意的是,以下app.js中的两行代码分别接受form请求与json请求。

// form
app.use(bodyParser.urlencoded({ extended: false }));
// json
app.use(bodyParser.json());

此外需注意,客户端传送json数据时得加上请求头

 'Content-Type': 'application/json'

直接访问html

我们知道express.static()中间件可以设定静态文件目录,如我们一般设置静态目录为public:

app.use(express.static(path.join(__dirname, 'public')));

我们只需要把html文件放入public文件夹中,接着可以直接使用地址访问:
http://域名或ip:端口/文件名.html。
其中发生过一个小插曲,我把.json文件放到了静态文件夹,发现尽管这样设置了还是不起作用,网上也找不到资料。后来一想,我的静态资源处理中间件:

app.use(express.static(path.join(__dirname, 'public'), {maxAge : 86400000}));

放在了设置的前头,是不是设置直接被忽略了呢,果然,在调换顺序后没有再出现错误。
问题:怎么图片文件就没出现这种情况呢?

服务端返回json

res.json({users: users});

域名重定向

相对于配置nginx,这或许是一个更简洁的方案

 response.writeHead(301, {
        Location: location
    });
response.write('资源已转移至 <a href="' + location + '">' + location + '</a>.');
response.end();

http.request

文档:http://nodejs.cn/doc/node/http.html#http_http_request_options_callback
这里直接上传完整案例(带参数的POST请求):

var querystring = require('querystring');
var postData = querystring.stringify(info);
var options = {
    host: 'ip/域名',
    port: 端口,
    path: '路径',
    method: 'POST',
    headers: {
      "Content-Type": 'application/x-www-form-urlencoded',
       'Content-Length': postData.length}
};
var req = http.request(options, function (res) {
    console.log("statusCode:" + res.statusCode);
    res.setEncoding('utf8');
    res.on('data', function (data) {
      console.log(data);
    });
});
req.on('error', function (e) {
     console.log("auth_user error: " + e.message);
});
req.write(postData);
req.end();

此方法在返回数据过长时可以采用以下方法进行处理(假设服务端返回为JSON字符串):

var json = '';
res.on('data', function (data) {
      json += data;
      console.log(data);
});
res.on('end', function () {
      var data = JSON.parse(json);
});

(完)

版权声明: 署名-非商业性使用-禁止演绎 4.0 国际(CC BY-NC-ND 4.0
Copyright ©2013-2017 | 粤ICP备14081691号 | yipeng手工打造 | 联系方式