Nodejs之Restify

标签: Nodejs 分类: Javascript 创建时间:2019-11-20 07:09:49 更新时间:2025-01-17 10:39:22

使用nodejs开发restful风格的api,我先选中了restify。其实为什么选择这个,而不是experss,这就因人而异了。其实对于一个架构师来说(我虽然没做过),如何再各种技术中取舍,也是一门学问,是激进的使用更新的技术,还是沿用团队成员都在使用的老的方法。要知道,任何一种架构的选择,以及技术的变更,都是需要成本的。再用新技术换来时间和空间成本的同时,也要照顾着自己以及其他人的学习成本。所以,开始任何一项技术研究之前,要做的就是对比各种技术的优缺点,要知道,任何一种技术和语言都不是完美的,都有其适用的场景。下面几篇文章,是restify和express的比较。
我觉得可能有两种不同,如果有界面,用express,如果只是用来做api,用restify。

参考文章:
1.求对比 restify 和 express:https://cnodejs.org/topic/543cc9fc91eadb0f73aa3498
2.Comparing Express, Restify, hapi and LoopBack for building RESTful APIs:https://strongloop.com/strongblog/compare-express-restify-hapi-loopback/

1.安装

cnpm install restify -D

2.获取post请求参数

要使用use对请求进行拦截,然后用plugins.bodyParser解析body的内容,否则就获取不到body中的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var restify = require('restify');

const server = restify.createServer({
name: 'myapp',
version: '1.0.0'
});

server.use(restify.plugins.acceptParser(server.acceptable));
server.use(restify.plugins.queryParser());
server.use(restify.plugins.bodyParser());

server.post('/api/kriging', function (req, res, next) {
console.log(req.body);
return next();
});

server.listen(8799, function () {
console.log('%s listening at %s', server.name, server.url);
});

3.设置跨域访问

1
2
3
4
5
6
server.use(function(req,res,next){
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
next();
})

pre:在确定路由之前执行的处理器链。
use:在确定路由之后执行的处理器链。

参考文章:
1.restify 中文手册:https://xiie.github.io/2016/10/restify-chinese-manual/
2.Node.js express 跨域问题:https://cnodejs.org/topic/51dccb43d44cbfa3042752c8

4.全局异常

像后台语言,比如Java、Php做Api开发,即使函数里面出现了错误,整个程序还是继续运行的,但是像nodejs这种,你要是写个没有捕获的异常,程序直接就退出了。比如我这里的JSON.parse(body),如果传入的参数中没有这个值,就会直接报错退出nodejs。
比如我这里的:

1
2
3
4
5
6
7
server.post('/api/kriging', function (req, res, next) {
let data=req.body;
console.log(data);
// 如果data中没有data这个对象,就会报错,进程直接终止掉了。
let datasett=JSON.parse(data.data)
return next();
});

当然你可以在每个方法里面,都用try{}catch{} 去捕获异常,可是这似乎不是长久之计。

我尝试了使用nodejs的全局异常处理方式

1
2
3
4
5
6
7
8
process.on("uncaughtExpection",function(){
console.log("dd");
console.error('Error caught in uncaughtException event:', err);
})
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason)
// sendErrCourier(reason)
})

都不起作用。

刚开始我也添加了很多的restifyError,依然不起作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

server.on('uncaughtException', function(req, res, route, err) {
console.log("ddd");

});
server.on('InternalServer', function (req, res, err, cb) {
// by default, restify will usually render the Error object as plaintext or
// JSON depending on content negotiation. the default text formatter and JSON
// formatter are pretty simple, they just call toString() and toJSON() on the
// object being passed to res.send, which in this case, is the error object.
// so to customize what it sent back to the client when this error occurs,
// you would implement as follows:
console.log("dddddd");

// for any response that is text/plain
err.toString = function toString() {
return 'an internal server error occurred!';
};
// for any response that is application/json
err.toJSON = function toJSON() {
return {
message: 'an internal server error occurred!',
code: 'boom!'
}
};

return cb();
});

server.on('restifyError', function (req, res, err, cb) {
// this listener will fire after both events above!
// `err` here is the same as the error that was passed to the above
// error handlers.
return cb();
});

最后解决方式是,再参考五中,找到了答案。在创建server对象时,添加 handleUncaughtExceptions: true 参数。这样,上面的server.on(“uncaughtException”) 就起作用了。

1
2
3
4
5
const server = restify.createServer({
name: 'PhGIShlgyNode',
version: '1.0.0',
handleUncaughtExceptions: true
});
参考文章:
1.Express中全局异常处理:https://segmentfault.com/q/1010000009295251
2.NodeJS和Express下的全局异常捕获处理:http://www.haiyang.me/read.php?key=765
3.在Express和Restify中处理uncaughtException:http://cn.voidcc.com/question/p-nyxspzqs-bcp.html
4.Express 框架中对错误的统一处理:https://itbilu.com/nodejs/npm/41ctyLryW.html
5.https://github.com/restify/node-restify/issues/1749
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。