遇到 node.js ,数据库,文件操作的 执行的异步问题.的坑

5 篇文章 0 订阅
4 篇文章 0 订阅

如题.用 js 写接口还是小白,这不,顺序执行的时候发现文件操作,数据库操作都是异步执行.不得不说这一点
node.js 保持了js 其脚本语言最大可能的灵活性,
下面就说说 据说是 node.js 最擅长的. 异步,同步处理.下面以,文件保存"后"读取文件大小信息为例子
说明一下

  1. 第一个坑:获取文件 的状态信息,首先必需要绝对地址而不是web 相对路径
let path = require('path');
path.resolve("public/civ_image/" + ran_number + "image.jpg")

如果不使用 path.resolve 将相对路径的 文件转换为绝对路径,将导致找不到文件的错误

no such file ....

2.第二坑:写入文件后. 读取文件信息(尺寸)大小 始终是"0" 的,这是因为写文件异步需要时间所以这个处理是和顺序执行异步的
,读取文件的信息和这个操作是非同步的.
读取文件信息的时候文件还没用写入.所以文件尺寸是零,要得到文件大小,必需等待,必需与写入文件处理,同步,写完文件后
再读取文件信息(大小)

*由于对js 语法不数量,花了点时间,(光看语法不行还是得多测试)
下面就说说同步node.js async模块,如何 保持执行的的顺序逻辑!

任务= [ 执行体1->,执行体2]
 async.waterfall(任务)

当然它还有很多种其他的方式.


                                var tasks_2=[
                                    function (callback) {

                                        fs.writeFile("public/civ_image/" + ran_number + "image.jpg", dataBuffer, function (err) {
                                            if (err) {
                                                resultStr2 = {
                                                    success: '9',
                                                    message: '保存文件失败'
                                                }
                                            } else {
                                                resultStr2 = {
                                                    success: '8',
                                                    message: '正确保存文件'
                                                }
                                            }

                                            callback(err)
                                        });

                                    },function (callback) {
                                        fs.stat(path.resolve("public/civ_image/" + ran_number + "image.jpg"),function (err,stats) {
                                            console.log("文件长度:" +stats.size) ;
                                        });

                                    }


                                ];

                                async.waterfall(tasks_2, function(err, results) {
                                   if(err)
                                   {
                                       console.log("文件长度读取错误:" +err.message) ;

                                   }
                                });

虽然说这种机制.解决了同步问题,总是感觉.好眼花缭乱.
我习惯了.结构化顺序这样看起来好乱,这方面确实有待自我反省.

  1. 数据库的操作,逻辑上,几个查询先后在逻辑上,需要对异步的查询进行同步.
    目标: 我的查询先后顺序上要利用前一个查询结果逻辑处理后,传递一个参数作为下一个查询的前提条件,
    所以必需要保持顺序执行的的逻辑,后一个查询必需等待.前一个查询顺利结束.

下面的片段很长所以只是截取了一段.原理和上面写文件差不多.只是需要传递参数.

       }, function(callback) {

            /***********************
             * 管理卡 读取
             * 查询有 session登录 权限
             ***********************/
            if (req.session.hasOwnProperty("user")) {

                connection.query('SELECT * FROM towncardrank WHERE town_card_rank_to_civ_id=?', req.session.user.id, function(err, result) {
                    callback(err, result[0].town_card_rank_number); 
                });

            }
        }, function(town_card_rank_number, callback) {

            /***************
             * 下面检查 操作数据和登录的权限匹配
             * 或者具有管理权限的才能登录
             ***************/
        if(req.session.hasOwnProperty("user") ||town_card_rank_number===10) {


callback(err, result[0].town_card_rank_number); 这个回调的传递的参数被下一个执行体 使用

function(town_card_rank_number, callback)

这个 result[0].town_card_rank_number 对应 town_card_rank_number 值是传递的.参数

吐槽
*都说x 如何如何不如xxxx ,xx如何好,其实久了都一样.堆叠起来,还不是山一样高.
人解读代码的还是顺序的.就像开车,操作上似乎比脚踏车自由度多几个,殊不知自由度,直升机还更高,
操作上,真正能解决人的负担的.只有AI ,不过这样一来.也就失去了.直接操作意义,
以前面朝黄土背朝天,现在,借助机器,有效率有,成果,只能感叹一去不复返了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值