在很多大公司的架构里,node都是作为中间层,主要负责下面几种任务:
1.中转一些请求,串接服务;同时也过滤一些基本的io请求
2.前端项目路由的相关业务处理
3.渲染前端模板(vue\react首屏)
3负责架构中部分专门的功能(以前公司将视频转码放node服务器上进行。。)
目前我看到的最常见的是前三种。作为一个服务端程序,除了路由、IO和中转请求,当然还可以做到其他服务器能做的事情。但是上层js单线程的异步结构实现,node的优势注定是面向高并发(或者说IO密集的场景),复杂逻辑和计算方面并不占优势。
从前端的角度,node虽然让我们可以接触后台的东西,只用js就可以捣鼓一些后台的功能,但是当我们项目需要一个稳定稳健的后台时,还是会把目光放到java、python等技术栈上。
[所以node程序一般会用forever或pm2这类进程管理工具,在服务崩了之后自动重启]
以前在公司时,node部分是老大写的,自己一直没写过中转请求,今天试了下,还是蛮简单的:
//中转前端请求,获取第三方服务的天气数据
var https = require('https');
module.exports = function(app) {
app.get('/realtimeWeather', function(req, res) {
let { cid } = req.query;
let body = '';
https.get(
`https://free-api.heweather.com/s6/weather/now?key=xxx&location=${cid}`,
function(weatherInfoRes) {
weatherInfoRes
.on('data', function(data) {
body += data;
})
.on('end', function() {
let { HeWeather6 } = JSON.parse(body);
let { basic, now, update, status } = HeWeather6[0];
if (status !== 'ok') {
res.send(JSON.stringify({ success: false, status }));
} else {
let { location } = basic;
let { cond_txt, tmp, wind_dir } = now;
let { loc } = update;
res.send(
JSON.stringify({
location,
cond_txt,
tmp,
wind_dir,
updateTime: loc,
success: true
})
);
}
});
}
).on('error', function(e) {
console.log('log weather error:'); //假如https.get抛出错误
console.error(e);
res.send(JSON.stringify({ success: false, status:"请求天气信息时发生错误" }));
});
});
};
我这里用的是和风天气的免费api,要先注册后使用。get请求中的key是用户私有的key,location是接口必须传送的城市编码。
另外,和风天气的城市编码文档是一份excel文件,而且有些字段不是我们必须的,只能自己转json,然后发现了一个在线excel转json的工具蛮好用:https://www.bejson.com/json/col2json/