NodeJS中常见异步接口定义(get、post、jsonp)
越来越多的人在使用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)的更多相关文章
- NodeJS中的异步I/O、事件驱动
nodejs的主要特点是单线程.异步I/O.事件驱动.让我们先大概了解一下这些名词的意思. 单线程 单线程是任务按照顺序执行的,并且每次只执行一个任务,只有前面的任务执行完成以后,后面的任务才执行.在 ...
- nodejs 中的异步之殇
nodejs 中的异步之殇 终于再次回到 nodejs 异步中,以前我以为异步在我写的文章中,已经写完了,现在才发现,还是有很多的地方没有想清楚,下面来一一说明. 模块同步与连接异步 大家应该,经常使 ...
- 深入理解nodejs中的异步编程
目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promise ...
- 如何优雅的处理Nodejs中的异步回调
前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O ...
- nodejs中的异步流程序控制nsync
异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数.ajax请求等等 http://cnodejs.org/topi ...
- nodejs中的异步回调机制
1.再次clear Timer定时器的作用 setTimeOut绝非是传统意义上的“sleep”功能,它做不到让主线程“熄火”指定时间,它是用来指定:某个回调在固定时间后插入执行栈!(实际执行时间略长 ...
- PHP中抽象类,接口定义
这里先介绍接口,因为在我最近看的好几本php工具书中都没有提到抽象类. 本人也觉得,在理解了接口后抽象类也非常好理解. 例子代码随便写了一下.例子代码是很ok的,测试过了不会报错,懒得看代码的筒靴们看 ...
- Nodejs中使用异步流程控制Async
首先,我们都知道,Node基于事件驱动的异步I/O架构,所谓异步就是非阻塞,说白了就是一个事件执行了,我不必等待它执行完成后我才能执行下一个事件.所以在Node环境中的模块基本都是异步的,上一篇说到我 ...
- Nodejs 中常见的加密算法:RSA(1)
Linux用户(以Ubuntu为例) $ openssl 进入OpenSSL程序 OpenSSL> genrsa -out rsa_private_key.pem 1024 生成私钥 OpenS ...
随机推荐
- MAC环境下idea:maven+Spring+Dubbo+Zookeeper简单工程搭建
: 一:安装软件:tomcatZookeeperDubbo+admin 二:工程: 总工程 API Pom.xml:不用引用任何东西 Provider Pom.xml:要denpend ...
- Mybatis学习笔记18 - 缓存
两级缓存: 一级缓存:(本地缓存):sqlSession级别的缓存.一级缓存是一直开启的:SqlSession级别的一个Map 数据库同一次会话期间查询到的数据会放在本地缓存中.以后如果需要获取相同的 ...
- org.apache.subversion.javahl.ClientException: Working copy is not up-to-date
之前因为将项目中的一个文件删除了,然后添加了新的文件,svn提交的时候报错. 提示:Working copy is not up-to-date 解决办法:对应的项目上右键然后选择team,然后选择u ...
- Mongodb~连接串的整理
mongodb连接串可以分为普通开放的,带全局用户名和密码的,为指定数据库指定用户名密码的等. 普通开放连接 mongodb://localhost:27017 带全局用户密码的 mongodb:// ...
- NLog学习笔记二:深入学习
配置文件 NLog所有的配置信息都可以写到一个单独的xml文件中,也可以在程序代码中进行配置. 配置文件位置 启动的时候,NLog会试图查找配置文件完成自动配置,查找的文件依次如下(找到配置信息则结束 ...
- CentOS7 安装oracle 客户端
参考 http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html 下载 oracle-instantclient11. ...
- c#获取目录
获取程序目录 string s = System.IO.Directory.GetCurrentDirectory(); Console.WriteLine(s);// C:\Users\r-\doc ...
- Oracle 数据库 导入导出空表解决办法!
expdp导出:(打开CMD) 先创建(任意盘符):\oracle_data 文件夹 1.sqlplus / as sysdba;2.create or replace directory d_nam ...
- HihoCoder#1509 : 异或排序(二进制)
题意 题目链接 Sol 挺简单的吧.考虑两个元素什么时候不满足条件 设\(a_i\)与\(a_i + 1\)最高的不同位分别为0 1,显然\(S\)的这一位必须为\(0\),否则这一位必须为\(1\) ...
- NoSQL(Not Only SQL)
Everything has its properties and has relation with each other. All in world can be related to each ...