越来越多的人在使用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. Vue 参数传递及刷新后依旧存在

    获取参数方式有两种: 1.params2.query 第一种方式: params this.$router.push({name:'Hello',params:{name:'zs',age:'22'} ...

  2. Lock接口和ReadWriteLock接口

    Lock接口 Lock接口在java.util.concurrent.locks包中,在jdk1.5之后才有. Lock接口有6个方法: void lock(); void lockInterrupt ...

  3. DRF之注册响应分页组件

    注册器 注册器的作用就是以后我们不用自己手动的一条条的敲路径了,它可以帮助哦们直接去找对应的路由,不用传参了,知道这一点就可以了,不多说还是,上代码实例 第一步:导入模块from django.url ...

  4. 错误 chamfermatching.cpp:969:30: error: the compiler can assume that the address of ‘annotate_img’

    修改 ./build/modules/contrib/CMakeFiles/opencv_contrib.dir/flags.make文件,删掉-Werror=address,然后重新make

  5. 带你认识spark安装包的目录结构

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  6. Spring核心-IOC-AOP-模版

    1. POM- 1.1 中央仓库 1.2 各包作用 spring-core.jar 核心工具类 spring-beans.jar 是所有应用都要用到的,它包含访问配置文件.创建和管理bean 以及进行 ...

  7. linux下追查线上问题常用命令

    (1)查占用cpu最多的进程方法一:核心指令:ps实际命令:ps H -eo pid,pcpu | sort -nk2 | tail执行效果如下:[work@test01 ~]$ ps H -eo p ...

  8. GET和POST区别和用法

    很多人都分不清GET与POST的区别,以及什么时候用GET?什么时候用POST? GET和POST两种方法都是将数据送到服务器,但你该用哪一种呢? HTTP标准包含这两种方法是为了达到不同的目的.PO ...

  9. C#使用MediaInfo查看媒体信息

    1.将MediaInfo.dll放入可执行目录. 2.将官网Demo里的MediaInfoDLL.cs放入项目中.(http://mediainfo.sourceforge.net/en/Downlo ...

  10. JQuery中的prop和attr

    prop和attr都可以用来获取并改变对象的属性, 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. 栗子: ...