2017-09-18 52 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