如何从节点后端向.hbs发送多个对象

时间:2019-02-24 15:54:11

标签: node.js

我当前正在尝试将2个对象发送到前端.hbs前端。但是我似乎无法解决如何做到这一点,因为我正在使用Promise。

当前,我的想法是我执行sql查询,提取国家和组织名称,然后将每个名称发送到地理编码api,返回并按相同的承诺压在一起。但是我不确定如何为渲染功能提取这些。

节点

   //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)

2 个答案:

答案 0 :(得分:0)

将您的var base = (function() { var url = $(location).attr('href'); if (url.substr(-1) === '/') url = url.slice(0, -1); var segments = url.split('/'); var baseUrl = this.segments[0] + '//' + this.segments[2] + '/'; var resource = this.segments[3]; function doStuffGlobally() { //do stuff for all pages } return { baseUrl, segments, resource, doStuffGlobal, }; }()); 换成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)
  ]));

As MadWard's answer mentions,必须解构Promise.all(promises).then(([geoLoc, geoBus]) => { res.render('layouts/layout', { results: JSON.stringify(geoLoc), businesses: JSON.stringify(geoBus) }); }); 的回调参数,因为所有内容都将在第一个参数中。确保您查看他的帖子以获取更多详细信息

答案 1 :(得分:0)

重要的是要记住:在then()回调中,您永远不会有多个参数。

现在您可能会问:对于Promise.all(),这个值是多少? 好吧,它是一个数组,其中包含等待调用中的所有值(按它们被调用的顺序)。

如果您这样做:

Promise.all([
    resolveVariable1, resolveVariable2, resolveVariable3
]).then((values) => {

})

values将是[variable1, variable2, variable3],即诺言所解决的三个变量。

但是,您的情况要复杂一些。最后将返回一个包含每个条目的二维数组。它是一个长度为results.length的数组,每个元素的长度为 2 。第一个元素是result,第二个元素是business

这是您的摘录:

Promise.all(promises)
  .then((values) => {
    let results = values.map(elmt => elmt[0]);
    let businesses = values.map(elmt => elmt[1]);
    res.render('layouts/layout', {
      results: JSON.stringify(results),
      businesses: JSON.stringify(businesses)
    });
})