nodejs如何获取数据库数据渲染页面

nodejs如何获取数据库数据渲染页面,第1张

首先这取决于你的首屏是怎么渲染的。

1、服务器端渲染:

后台把数据按照格式拼成html字符串(服务器端模板引擎最终也干的是这个,不过是更优雅而已),最终生成完整html文件。

2、客户端渲染:

html文件只包含静态的内容,客户端打开html后再发起ajax请求去后台请求数据,前台拿到数据拼html字符串查到html文件里(同上,客户端模板引擎最终也干的是这个,不过是更优雅而已)。中国电信提供最优质的网络通讯服务,如需相关业务,可以直接通过电信网上营业厅或者实体营业厅查询。安徽电信竭诚为您服务。

function readLog(date,type,operation){//函数接受3个参数,日期、精度(天时分秒)和 *** 作(查找、刷新或者默认)        if(date){        //如果有时间参数则对时间参数进行处理(一般日志名称都是时间加类型)            var dataStr = arguments[0];            var date = dataStrslice(0,10);            var hour = dataStrslice(11,13);            var minute = dataStrslice(11,16);            var second =dataStrslice(11,19);            var type = arguments[1];            //获取精度

        }else{        //若无时间参数则获取当前时间,然后精度默认            var date = new Date(+new Date()+836001000)toISOString()replace(/T/g,' ')replace(/\[\d]{3}Z/,'')slice(0,10);            var type=null;

        }        var op = arguments[2];        var countResult = 0;        //对日志结果进行统计        var logPath = appDirNameslice(0,-3)+'log\\'+'ivsvr_'+date+'log';        //拼接日志文件名称        var logStr = '';

        fsstat(logPath, function (err, stats) {        //获取对应的日志文件状态        if(err){        //日志不存在或者异常处理信息

            $('#logTipInfo tr td')html('无日志信息可供查看');            consolelog(err);

        }else{            var lineCount = 0;            var readline = require('readline');            var fReadName = logPath;            var fRead = fscreateReadStream(fReadName);            var objReadline = readlinecreateInterface({                input: fRead,

            });            //按行读取日志

            objReadlineon('line', (line)=>{                var itemStr = $trim(line);                var time = itemStrslice(0,19);                var content = itemStrsubstr(20);                if(!time || !content){return;}

                ++ lineCount;                //计数行数                var matched = true;                var itemStr = $trim(line);                var itemArr = itemStrsplit(' ');                var logDate = itemArr[0];                var logTime = itemArr[1];                var time = logDate+' '+logTime;                switch(type){                //进度查找过滤                    case '0':                    case null:

                        matched = true;                        break;                    case '1':                        var timeSplit = logTimeslice(0,2);                        if(timeSplit == hour){

                            matched = true;                            break;

                        }

                        matched = false;                        break;                    case '2':                        var timeSplit = logTimeslice(0,5);                        if(timeSplit == minute){

                            matched = true;                            break;

                        }

                        matched = false;                        break;                    case '3':                        var timeSplit = logTimeslice(0,8);                        if(timeSplit == second){

                            matched = true;                            break;

                        }

                        matched = false;                        break;                    default:                        consolelog('unkonw type!');                        break;

                }                if(matched === true &&(lineCount>logReadFlag)){                //日志结果格式化输出呈现

                    countResult ++;                    var result = itemArr[2];                    if(result == 'err'){                        var operation = itemArr[4];

                        result = '失败:'+itemArr[5]+' '+(itemArr[6]itemArr[6]:'');

                    }else{                        var operation = itemArr[4]+' '+itemArr[5]+(itemArr[6]itemArr[6]:'');

                        result = '成功';

                    }

                    logStr += '<tr><td>'+time+'</td><td>'+operation+'</td><td>'+result+'</td></tr>'

                }

                logStr += '<tr><td>'+time+'</td><td>'+content+'</td></tr>'

            });            objReadlineon('close', ()=>{                if(logReadFlag == 0 && (logStr == '')){                    var info = '无日志信息可供查看';

                }                if(logReadFlag >0 && (logStr != '')){                    var newLogNum = lineCount - logReadFlag;                    var info = '刷新成功,更新'+newLogNum+'条日志!';

                    $('#logInfoTable')prepend(logStr);

                }else if(logReadFlag >0 && (logStr == '')){                    var info = '刷新成功,无日志更新!';

                }else{

                    $('#logInfoTable')html(logStr);

                }                if(op == 'search'){                    var info = '查找到'+countResult+'条日志';

                }

                $('#logTipInfo tr td')html(info);                if((op == 'search' || op == 'refresh') &&(logReadFlag != 0 || newLogNum >0 || countResult >0)){

                    setTimeout(function() {$('#logTipInfo')fadeOut(567);}, 2000);                    // *** 作结束后给出信息反馈,反馈自动淡出消失

                }                else{

                    $('#logTipInfo')hide();

                }

                logReadFlag = lineCount;                consolelog('closed');

            });

        }

    });

}

前端日常开发中,会遇见各种各样的cli,比如一行命令帮你打包的webpack,一行命令帮你生成vue项目模板的vue-cli,还有创建react项目的create-react-app等等等等。这些工具极大地方便了我们的日常工作,让计算机自己去干繁琐的工作,而我们,就可以节省出大量的时间用于学习、交流、开发、 逛steam 。

但是有时候一些十分特别的需求,我们是找不到适合的cli工具去做的。比如说,你的项目十分庞大,你给项目添加一个新的路由,要经过 创建目录 -> 创建vue文件 -> 更新vue-router的路由列表 这一趟流程,就算快捷键创建目录文件用得再熟悉,也比不过你一行命令来得快,特别是路由目录嵌套深,vue文件初始化模板复杂的时候。

所以呢,何不为自己项目写一个cli?就专门做这些繁琐的活?

nodejs的cli,本质就是跑node脚本嘛,基本上每位前端er都会:

然后命令行调用

可以做得更逼真一点,我们在packagejson里面的scripts字段上添加一下脚本名:

然后命令行调用:

但是,看到这里你肯定会说,人家webpack还有vue-cli都是“有名字”的!什么 vue-cli init app 、 webpack -p 的,多漂亮,看看这个命令行, node indexjs ,还 npm run hello ,谁不会啊,丑不拉几的,怕又不是来水文章的哦?差评!!

别急啊各位大人,接下来就说说,如何给这个node脚本起个名字。

姑且,先把这个cli的名字命名为 hello-cli ,就是我们能够在命令行里面,输入 hello-cli ,然后它就打印一句 hello world ,没有 node 也没有 npm ,就是:

这样,你的第一个cli脚本就成功安装了,可以在命令行里面,直接敲你的cli名字,看看结果输出吧。

另外,如果你仅希望你的cli脚本仅在项目里执行,则需要在你项目里面新建一个目录,重复上述的 *** 作,只是在第三步的时候,不要llink到全局里面去,而是使用 npm i -D file:<你的脚本cli目录路径> ,把它当成项目的依赖安装到node_modules里面去,如果安装成功,那么在项目的packagejson你会看到多了一条依赖,这条依赖的值不是版本号,而是你脚本的路径。然后在node_modules里面会有一个bin目录,里面就存放着你的可执行文件。

当然,这样安装的cli脚本,必须在项目的packagejson的scripts字段上声明脚本命令,然后通过 npm run 的方式执行。

哦?这样子使用的话不就回到最最最开始的时候那种原始的 npm run hello 一样么。

是的,但是有质的区别。使用 node indexjs 这种方式调用的话固然简单灵活,但是严重依赖脚本路径,一旦目录结构发生变动,写在scripts的命令就要更改一次;但是使用npm安装之后,本地的cli脚本就被拉到node_modules里面,目录结构变动对其影响不大。其次是不利于分享与发布,如果你想把你的cli脚本发布出去,那么有一个好听响亮的名字,比起在说明文档里面告诉使用者如何找到你的脚本路径再用node执行它,简直好上那么一万倍不是么?

这里也给我们提供了一个cli开发流程思路:

名字有了,输出也有了,看看我们跟那些大名鼎鼎的cli工具,在形式上还差点啥?对了,人家可以支持不同参数选项的,还可以根据输入的不同,产生不同的结果。

这样吧,我们给这个cli加一个功能,既然叫 hello-cli ,那不能只会 hello world 吧,必须要见谁就说 hello 才行:

虽然这个功能很简单,但是至少也是实现了“根据输入的不同,产生不同结果”的效果。

命令行上的参数,可以通过 process 这个变量获取, process 是一个全局对象而不是一个包,不需要通过 require 引入。通过 process 这个对象我们可以拿到当前脚本执行环境等一系列信息,其中就包括命令行的输入情况,这个信息,保存在 processargv 这个属性里。我们可以打印一下:

打印结果:

可以看出,argv是个数组,前两位是固定的,分别是node程序的路径和脚本存放的位置,从第三位开始才是额外输入的内容。那么实现上面的功能就很简单了,只要读取argv数组的第三位,然后输出出来就可以了。

npm社区中也有一些优秀的命令行参数解析包,比如 yargs ,tj的 commanderjs 等等

如果你想使用比较复杂的参数或者命令,建议还是用第三方包比较好,手写解析太耗精力了。

现在,你可以自由自在的写你自己的cli脚本了。

如果你希望写一个项目打完包自动推上git的cli,或者自动从git仓库里面拉取项目启动模板,那么,你需要通过node的 child_process 模块开启子进程,在子进程内调用git命令:

不仅是git命令,包括系统命令、其他cli命令都可以在这里执行。特别是系统命令,使用系统命令对文件目录进行 *** 作,效率比fs高到不知道哪里去了。

社区上也有一些不错的包,比如阮一峰老师推荐的 shelljs

如果你不那么希望你的cli用起来那么“硬核”,希望更人性化一点,比如提供一些友好的输入、提示啊,给你的输出加点颜色区分重点啊,写个简单的进度条啊等等,那么你就需要美化一下你的输出了。

除了颜色这部分,不使用第三方包实现起来非常繁琐复杂,其他的功能,都可以试试自己写。

颜色部分使用了第三方包 colors ,这里就不演示了。

其他都是由nodejs自带的 readline 模块实现的。

绘制的思路跟canvas绘制动画一样,只不过canvas是清除画布,而命令行这里是通过 readlineclearScreenDown 清除输出。

这样,一个简易的,人性化的,带点点进度条动画的命令行cli工具就写好了,你也可以发挥你的想象力,去写一些更有趣的效果出来。

毕竟我们前端,有浏览器我们可以写动画,没了浏览器我们一样可以写动画。

以上就是关于nodejs如何获取数据库数据渲染页面全部的内容,包括:nodejs如何获取数据库数据渲染页面、nodejs怎么获取当前请求的日志、手把手教你使用nodejs编写cli(命令行)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9578917.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存