使用 node express 从类中渲染方法

Posted

技术标签:

【中文标题】使用 node express 从类中渲染方法【英文标题】:Render method from class with node express 【发布时间】:2019-09-10 17:51:39 【问题描述】:

我有一个类的方法应该给我一个 API 的域。 到目前为止,这也有效。但是如果我想用 Node Express 渲染它,我会得到一个 1.2.3 的数组。没有域名。

我认为我的问题在于异步等待?!

这是我的类方法中的一个 sn-p:

class ISPConfig 
    constructor(base_url, options) 
        this.base_url = base_url;
        this.options = options;
    

    async _call() 
        ... // gives me the sessionId
    

    async getDataByPrimaryId(ispFunction, param) 
        try 
        const results = await axios.post(this.base_url + ispFunction, 
            session_id: await this._call(),
            primary_id: param
        );
        return await results.data.response;
        //console.log(results.data.response);
         catch (err)
            console.log(err);
        
    

她是我 app.js 中的一个 sn-p:

const renderHome = (req, res) => 
    let domains = [],
        message = '';
    let a = new ispwrapper.ISPConfig(BASE_URL, OPTIONS)
    a.getDataByPrimaryId('sites_web_domain_get',  active: 'y' )
        .then(response => 
            for (let i = 0; i < response.length; i++)
                domains = response[i]['domain'].domains;
            
        )
        .catch(err => 
            message = 'Error when retriving domains from ISPApi';
        )
        .then(() => 
            res.render('home',  // 'home' template file for output render
                title: 'ISPConfig',
                heading: 'Welcome to my ISPConfig Dashboard',
                homeActive: true,
                domains,
                message
            );
        );
;

使用 push(domains) 我只能访问 html 页面 1.2.3。

这与我的 API 的三个活动域完全对应。但只是没有域名。 :(

但如果我在 for loop console.log(response[i]['domain'].domains) 中输出,我会在控制台中获得所有具有名称的域。

有人看到我的错误吗?

这是我的解决方案:

const renderHome = async (req, res) => 
let domain = [],
    message = '';
try 
    let a = new ispwrapper.ISPConfig(BASE_URL, OPTIONS);
    const response = await a.getDataByPrimaryId('sites_web_domain_get',  active: 'y' );

    for (let i = 0; i < response.length; i++)
         domain.push(response[i].domain);
    
 catch(err) 
    message = 'Error when retriving domains from ISPApi';
 finally 
    res.render('home',  // 'home' template file for output render
        title: 'ISPConfig',
        heading: 'Welcome to my ISPConfig Dashboard',
        homeActive: true,
        domain,
        message
    );

;

【问题讨论】:

【参考方案1】:

尝试让你的路线也异步:

const renderHome = async (req, res) => 
  let domains = [],
      message = '';
  try 
    let a = new ispwrapper.ISPConfig(BASE_URL, OPTIONS)
    const response = await a.getDataByPrimaryId('sites_web_domain_get',  active: 'y' )

    for (let i = 0; i < response.length; i++)
      domains.push(response[i].domain);
    
   catch(err) 
    message = 'Error when retriving domains from ISPApi';
   finally 
    res.render('home',  // 'home' template file for output render
      title: 'ISPConfig',
      heading: 'Welcome to my ISPConfig Dashboard',
      homeActive: true,
      domains,
      message
    );
  
;

【讨论】:

谢谢,这也是我的第一个想法。因为该类也是用 async / await 语法编写的。不幸的是,这只在 for 循环中给了我 3 x undefined。 你能把response的结果链接到一些小提琴 循环内:undefined undefined undefined 循环外:undefined 在您链接的response 中,没有一个对象具有domain.domains 属性。在其中的每一个中,domain 只是一个字符串。更新答案以反映这一点。退房【参考方案2】:

是的,未定义的不再是问题。但是如何让域显示在 HTML 页面上?来电是灰色的。

【讨论】:

以上是关于使用 node express 从类中渲染方法的主要内容,如果未能解决你的问题,请参考以下文章

Node.js中的express框架获取http参数

从类中调用父方法

使用线程安全方法从类中的多个方法填充 Collection 或 Map

机器人框架:无法使用 __eq__ 方法从类中获取关键字

在 express 节点 js 中重新渲染 EJS 模板

Grails / Spock:如何在类中模拟从类本身调用方法的单个方法?