首页 > 解决方案 > 如何将多个对象从节点后端发送到 .hbs

问题描述

我目前正在尝试将 2 个对象发送到前端 .hbs 前端。但是我似乎无法弄清楚如何做到这一点,因为我正在使用承诺。

目前,我的想法是我执行 sql 查询,提取国家和组织名称,然后分别发送到地理编码 api,返回然后在相同的 promise 中压缩在一起。但我不确定如何为渲染功能提取这些。

节点

   //route for homepage
app.get('/', (req, res) => {

  let sql = "SELECT org_name, country_name from places;

  let query = conn.query(sql, (err, results) => {

    if (err) throw err;


    const geoPromise = param => new Promise((resolve, reject) => {
      geo.geocode('mapbox.places', param, function(err, geoData) {
        if (err) return reject(err);
        if (geoData) {
          resolve(geoData.features[0])
        } else {
          reject('No result found');
        }
      });
    });

    const promises = results.map(result =>
      Promise.all([
        geoPromise(result.country_name),
        geoPromise(result.org_name)

      ]));



      Promise.all(promises).then((geoLoc, geoBus) => {
        res.render('layouts/layout', {
          results: JSON.stringify(geoLoc),
          businesses: JSON.stringify(geoBus)
        });
      });



  });
});

前端调用

 results1 = {{{results}}}
console.log(results1.length)

business1 = {{{businesses}}}
console.log(business1.length)

标签: node.js

解决方案


把你包geo.geocode成一个Promise

const geoPromise = param => new Promise((resolve, reject) => {
  geo.geocode('mapbox.places', param, function(err, geoData) {
    if (err) return reject(err);
    if (geoData) {
      resolve(geoData.features[0])
    } else {
      reject('No result found');
    }
  });
});

结合两个调用geo.geocode

const promises = results.map(result =>
  Promise.all([
    geoPromise(result.country_name),
    geoPromise(result.org_name)
  ]));

给他们打电话

Promise.all(promises).then(([geoLoc, geoBus]) => {
  res.render('layouts/layout', {
    results: JSON.stringify(geoLoc),
    businesses: JSON.stringify(geoBus)
  });
});

正如 MadWard 的回答所提到的,解构回调的参数Promise.all是必要的,因为一切都将在第一个参数中。确保您查看他的帖子以获取更多详细信息


推荐阅读