使用Node.js处理Firebase中的多种功能

时间:2020-07-22 12:32:40

标签: node.js firebase firebase-realtime-database

全部,

我是Nodejs和Firebase的新手,我需要在一个函数中实现两个功能,并且我编写了一段代码,效果很好。

但是我的问题是,我编写的代码是实现多种功能的正确方法,还是我们有其他替代方法(正确的方法)来实现相同的功能。

疑问: 检索项目的相关详细信息---->内部回调函数---->将数据保存到另一个表中---->内部回调函数---->从表中删除数据----->内部回调函数- --->回复

我们是否需要在嵌套回调函数中编写功能以实现输出,还是有其他方法可以实现输出。

// Nodejs Post Function 
app.post('/delete_user_request_project/', function (req, res) 
{ 
    if (!is_admin_login(req.cookies.login_type)) 
    {
        return res.redirect('/');
    }

    var project_id = req.body.project_id; // Getting the project Id
    let del_ref = admin.database().ref("user_request_project/" + project_id);   // Targeting the  details of the project to fetch that particular data 
    del_ref.once("value", function (snapshot) 
    {
        var request_project_obj = snapshot.val(); // fetching the details of project 
        if (request_project_obj != null) 
        {   
            let update_ref = admin.database().ref("deleted_user_request_project/" + project_id);
            update_ref.set(
                request_project_obj         // Updating project details to another table 
            ).then(function () 
            {  
                del_ref.remove().then(function () // Deleting the details from project Table 
                {
                    return res.status(200).send('success');
                });
            });            
        }
        else 
        {
            var error = "プロジェクトが存在しない";
            req.flash("error", error_message);
            return res.send({
                status: 'error',
                error: error
            });
        }
    });
})

TIA

1 个答案:

答案 0 :(得分:1)

我建议您使用once()方法的Promise版本而不是Callback版本,如下所示。它将允许您正确地chain the different promises由异步Firebase方法返回。

app.post('/delete_user_request_project/', function (req, res) {
    if (!is_admin_login(req.cookies.login_type)) {
        return res.redirect('/');
    }

    var project_id = req.body.project_id; // Getting the project Id
    let del_ref = admin.database().ref("user_request_project/" + project_id);   // Targeting the  details of the project to fetch that particular data 
    del_ref.once("value")
        .then(function (snapshot) {
            var request_project_obj = snapshot.val(); // fetching the details of project 

            if (request_project_obj != null) {
                let update_ref = admin.database().ref("deleted_user_request_project/" + project_id);
                return update_ref.set(request_project_obj);         // Updating project details to another table 
            }
            else {
                throw new Error('request_project_obj null');
            }
        })
        .then(function () {
            return del_ref.remove();
        })
        .then(function () // Deleting the details from project Table 
        {
            return res.status(200).send('success');
        })
        .catch(function (error) {
            if (error.message === 'request_project_obj null') {
                var error = "プロジェクトが存在しない";
                req.flash("error", error_message);
                return res.send({
                    status: 'error',
                    error: error
                });
            } else {
                //...
            }

        })

})