2017-09-18 47 views
0

我使用loopback3,我正在考虑优化代码库,什么是注入应用程序对象作为参数到getUser方法从afterRemote挂钩https://loopback.io/doc/en/lb2/Remote-hooks.html,如果我可以通过直接在userService.ts中访问环回实例。注入应用程序作为参数vs导入应用程序从server.js在loopBack框架

我觉得我失去了一些重要的东西在这里,我试图总结如下

答:对于我进口是更好,因为我将有更少的代码,不存在 将无需注入应用每一次。

B.铸造的和进口 对象是相等的,_.isEqual(APP,APP)

C.我已经检查了 性能process.hrtime(),并得到了相同的结果。

应用程序/模型/ activity.ts

import {UserService} from 'app/service/userService'; 
import {Attach} from 'app/models/remote/activityRemote'; 

export = function (Activity) { 

    Activity.afterRemote('find', function (ctx, result, next) { 
    UserService.getUser(Activity.app, Activity.username) 
     .then(() => next()) 
     .catch(next); 
    }); 


    /** 
    * attach remote 
    */ 
    Attach(Activity); 
}; 

userService.ts

import {Server} from 'app/server/interface/server'; 
import * as App from 'app/server/server'; 
import * as _ from 'lodash'; 

/** 
* @class UserService 
*/ 
export class UserService { 

    /** 
    * get user's public profile 
    * @param {Server} app loopback app 
    * @param {string} username 
    * @returns {Promise<User>} 
    */ 
    public static getUser(app: Server, username: string): Promise<User> { 

    return App.models.user.findOne(filter) // Equal and 
    return app.models.user.findOne(filter) // does the same 
     .then((user: User) => { 
     if (!user) { 
      return Promise.reject(ServerError.get('User not found', 404)); 
     } 

     return Promise.resolve(user); 
     }); 
    } 
} 

server.ts

import {Server} from 'app/server/interface/server'; 
import * as loopback from 'loopback'; 
import * as boot from 'loopback-boot'; 

let App: Server = loopback(); 

module.exports = App; 
export = App; 

App.start =() => { 
    return App.listen(() => { 
    const baseUrl = App.get('url').replace(/\/$/, ''); 
    App.emit('started'); 

    console.log('Web server listening at: %s', baseUrl); 

    if (App.get('loopback-component-explorer')) { 
     console.log(
     'Browse your REST API at %s%s', 
     baseUrl, 
     App.get('loopback-component-explorer').mountPath 
    ); 
    } 
    }); 
}; 


boot(App, __dirname, (err: Error) => { 
    if (err) { 
    throw err; 
    } 

    if (require.main === module) { 
    App.start(); 
    } 
}); 

回答

2

除非你有多个回送应用程序在同一个进程中进行,那么您没有理由将该应用程序作为参数传递。只需import该应用程序,因为它更可读和更清洁。

而且你不需要使用Promise.resolve当你已经有一个承诺:

return app.models.user.findOne(filter) // does the same 
    .then((user: User) => { 
    if (!user) { 
     throw ServerError.get('User not found', 404); 
    } 

    return user; 
    }); 

这将有同样的效果。

+0

感谢您的回复:) 不清楚什么是“多个回送应用程序”,您能给我一个这种情况的例子吗? – ivanproskuryakov

+1

基本上,如果您出于任何原因多次调用'loopback()'。在测试中,你可能会这样做(这是一个[示例](https://github.com/strongloop/loopback/blob/v3.11.1/test/app.test.js#L24))。如果发生这种情况,您可能不仅仅能够导入主文件并轻松获取回送应用程序,您必须通过它。 –

+0

看起来像它返回相同的实例都为“this.app”,“导入*作为从'loopback'回环'”和https://github.com/strongloop/loopback/blob/v3.11.1/test/app。 test.js#L24。 由于Module._load是缓存所需的模块。 来源:https://blog.risingstack.com/node-js-at-scale-module-system-commonjs-require/ – ivanproskuryakov