SailsJs将函数调用到同一个控制器中

时间:2017-04-20 15:30:49

标签: javascript sails.js

我想在同一个控制器中调用一个函数,但我大多有一个错误:“ReferenceError:myFunctionB未定义”

module.exports = {

    myfunctionA: function(req, res){

        var theword;
        theword = myFunctionB({id:26})

        return res.json({say:theword})

    }, 

    myfunctionB: function(req, res){

        var id = req.param('id');

        niceword.get({
            id:id
        }, function(err, word){

            if(err){return res.negotiate(err);}
            if(!word){return res.json({err:"no word found"})}

            return res.json({word:word});

        })

    }

}

我还尝试将myFunctionB放入服务中,但是,因为我使用了许多其他控制器等,所以我没有回复..任何想法?

2 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。正如yBrodsky所说,正确的方法是创建一个运行回调或返回承诺的服务:

myServiceFunctionB: function(params, cb) {
   var id = params.id;
   niceword.get({
        id:id
    }, function(err, word){
        return cb({ say: { word: word });
    });
}

然后在你的控制器中,只需使用:

return MyServiceName.myServiceFunctionB({id: 26}, res.json);

您还可以传递您的req和res以继续使用它们:

myServiceFunctionB: function(req, res) { ...

或者,您可以在控制器中使用this关键字:

myfunctionA: function(req, res){
    req.params.id = 26;
    return this.myfunctionB(req, res);
}

如果您将在上下文丢失的情况下执行更复杂的逻辑,只需在开头设置一个新的var:

myfunctionA: function(req, res){
    var self = this;
    req.params.id = 26;
    //...lots of nested promises or callbacks...
         return self.myfunctionB(req, res);
}

答案 1 :(得分:0)

谢谢yBrodsky和wwwslinge,我最终得到了我需要的感谢。

我不得不做一点改动,因为我们仍需要在传入函数后使用数据。

控制器

MyServiceName.functionB({id:1}, function(data){

    // doing some stuff with the data and then
    return res.json({data: data});

});

服务

functionB: function(params, cb){

    var id = params.id;

    Niceword.getbyid({
        id:id
    }, function(err, word){

         if(err){return err}
         return cb({word:word});

    })

}