越来越多的人在使用nodeJS,作为一门服务端语言,我们不可避免的要写异步接口(ajax和jsonp)。再次强调ajax和jsonp是两个概念,但是由于jquery的封装,使这两种异步接口的调用方式,看起来比较相近,但在底层差别还是比较大的(本文只写服务端的实现)。

  为了便于讲解我使用express框架来运行我的demo。并分别讲解如何获取参数,并返回结果。本文相当于一个基础篇,只写了一些常见的应用场景。漏掉一些复杂的场景,还望提醒。

一、Ajax——post请求

  之所以先从post开始,是因为我想把get和jsonp挨的比较近一些。而且post获取参数的方式和两外两种相比差别比较大。

  一个基本的post请求:

 var express = require('express');var router = express.Router();

 router.post('/simplePost', function (req, res, next){
var param = req.body;
//console.log(param);
//todo something
res.json({"errorCode": 0,"errorMessage": 'save'});
});

  router是框架中定义路由的对象,我们相当于在router上绑定对应controller的回调函数。回调函数中会传入3个变量,分别封装了请求(req)、响应(res)和下一个中间件(next)。在post请求中参数被封装在req中的req.body 我们 console.log(param); 就可以在控制台看到参数了。通过一系列操作,当我们想返回结果(通常为json)的时候,就需要调用res下的json来将一个对象返回客户端(前端)。

二、Ajax——get请求

  get 请求和post大体相近,但略有不同。不多说,先看代码:

 var express = require('express');
var router = express.Router();
var urllib = require('url'); router.get('/simpleGet', function (req, res, next){
var params = urllib.parse(req.url, true);
//console.log('params',params);
var query = params.query;
// todo something
res.json({"errorCode": 0,"errorMessage": 'save OK'});
});

  get请求的参数不可以直接在req.body中取出,要想获取参数就要先加载“url”模块   var urllib = require('url'); 通过模块封装的方法parse取出包含参数的对象,并将query取出,这是打印query,就可以看到前端发来的参数了。至于返回结果,就合post一样了。

三、jsonp

  jsonp实际上发出的是一个js文件请求,所以本质上是get请求(但不是Ajax)。jsonp在获取参数这块和get(ajax)是一样的。但不同在与返回结果的方式。

 var express = require('express');
var router = express.Router();
var urllib = require('url'); router.get('/simpleJsonp', function (req, res, next){
var params = urllib.parse(req.url, true);
var reqData = {};
var query = params.query; //res.send(reqData);
//console.log(params); // todo somthing
if(params.query && params.query.callback){
var str = params.query.callback + '(' + JSON.stringify(reqData) + ')';//jsonp
res.end(str);
}else{
res.end(JSON.stringify(reqData));
}
});

  我们需要在获取参数后判断有没有约定好的回调函数的属性名“callback”  ——  if(params.query && params.query.callback){}。如果没有我认为我可以按普通的get(ajax)来处理,反之我认为是jsonp。jsonp需要将“调用”的方式,将结果返回:

params.query.callback + '(' + JSON.stringify(reqData) + ')';

总结:

  这样就完成了常用异步接口的盘点,文中都是一些常见的最基本的场景。但是这也是复杂场景的基石。文中不对的地方还望大家多多斧正。

  

  

NodeJS中常见异步接口定义(get、post、jsonp)的更多相关文章

  1. NodeJS中的异步I/O、事件驱动

    nodejs的主要特点是单线程.异步I/O.事件驱动.让我们先大概了解一下这些名词的意思. 单线程 单线程是任务按照顺序执行的,并且每次只执行一个任务,只有前面的任务执行完成以后,后面的任务才执行.在 ...

  2. nodejs 中的异步之殇

    nodejs 中的异步之殇 终于再次回到 nodejs 异步中,以前我以为异步在我写的文章中,已经写完了,现在才发现,还是有很多的地方没有想清楚,下面来一一说明. 模块同步与连接异步 大家应该,经常使 ...

  3. 深入理解nodejs中的异步编程

    目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promise ...

  4. 如何优雅的处理Nodejs中的异步回调

    前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O ...

  5. nodejs中的异步流程序控制nsync

    异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数.ajax请求等等 http://cnodejs.org/topi ...

  6. nodejs中的异步回调机制

    1.再次clear Timer定时器的作用 setTimeOut绝非是传统意义上的“sleep”功能,它做不到让主线程“熄火”指定时间,它是用来指定:某个回调在固定时间后插入执行栈!(实际执行时间略长 ...

  7. PHP中抽象类,接口定义

    这里先介绍接口,因为在我最近看的好几本php工具书中都没有提到抽象类. 本人也觉得,在理解了接口后抽象类也非常好理解. 例子代码随便写了一下.例子代码是很ok的,测试过了不会报错,懒得看代码的筒靴们看 ...

  8. Nodejs中使用异步流程控制Async

    首先,我们都知道,Node基于事件驱动的异步I/O架构,所谓异步就是非阻塞,说白了就是一个事件执行了,我不必等待它执行完成后我才能执行下一个事件.所以在Node环境中的模块基本都是异步的,上一篇说到我 ...

  9. Nodejs 中常见的加密算法:RSA(1)

    Linux用户(以Ubuntu为例) $ openssl 进入OpenSSL程序 OpenSSL> genrsa -out rsa_private_key.pem 1024 生成私钥 OpenS ...

随机推荐

  1. Java基础08-猜拳游戏

    自己写的low代码 import java.util.*; public class Test1{ public static void main(String[] args){ System.out ...

  2. BaseAdapter,SimpleAdapter,CursorAdapter的用法

    简单好用的Adapter---ArrayAdapter ArrayAdapter是BaseAdapter的派生类,在BaseAdapter的基础上,添加了一项重大的功能:可以直接使用泛型构造. 我们先 ...

  3. (转)rsync数据备份方案

    rsync数据备份方案 原文:http://blog.51cto.com/irow10/1826458 最近整理了下公司的数据备份情况.以下是部分操作的过程 1.rsync数据备份,具体备份过程就不详 ...

  4. HDU 4612——Warm up——————【边双连通分量、树的直径】

    Warm up Time Limit:5000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  5. C++ 虚函数、纯虚函数、虚继承

    1)C++利用虚函数来实现多态. 程序执行时的多态性通过虚函数体现,实现运行时多态性的机制称爲动态绑定:与编译时的多态性(通过函数重载.运算符重载体现,称爲静态绑定)相对应. 在成员函数的声明前加上v ...

  6. [巩固C#] 二、什么是反射、反射可以做些什么

      阅读目录   关闭   什么是反射,反射能干嘛? 获取类型的相关信息 获取类型本身信息(命名空间名.全名.是否是抽象.是否是类..... 获取类型成员信息(通过Tyep中的方法GetMembers ...

  7. css透明边框实现

    代码:   css:      .box1{ background: black; padding:20px; } .box2{ background: #fff; border: 10px soli ...

  8. AngularJS 指令解析(二)

    AngularJS 指令解析(二) 第一篇我们讲过了作用域(scope)这块内容,现在我们进入正题,讲AngularJS的指令. 什么是指令? 这里我们引用官方的一句话: Custom directi ...

  9. FastReport Site授权联合推广计划 彻底保障商业化开发,还送iPhone 5s

    上月慧都与报表控件开发商Fastreport联合推出的优惠活动,获得中国开发者的巨大反响.本月慧都再次发力,与Fast Reports, Inc.联合推出FastReport Site授权推广计划.活 ...

  10. SpringCloud的学习记录(3)

    这一章节讲搭建config-server的项目. 在我们生成的Demo项目上右键点击New->Module->spring Initializr, 然后next, 填写Group和Arti ...