Javascript从数据库记录中自动生成列表

时间:2018-03-31 11:13:07

标签: javascript node.js

我觉得我愚蠢,这很简单。我试图创建一个类似于以下内容的Javascript列表:

var sitemap = sm.createSitemap({
    hostname: hostname,
    cacheTime: 600000,  //600 sec (10 min) cache purge period 
    urls: [
        { url: '/' , changefreq: 'weekly', priority: 0.8, lastmodrealtime: true, lastmodfile: 'views/home.hbs' },
        { url: 'photo/image_id1', changefreq: 'weekly', priority: 0.8, lastmodrealtime: true},
        { url: 'photo/image_id2', changefreq: 'weekly', priority: 0.8, lastmodrealtime: true},
        { url: 'photo/image_id3', changefreq: 'weekly', priority: 0.8, lastmodrealtime: true}
        ...
    ]
});

为了使用以下内容自动生成底部3个网址:

function photoURLs() {
    var siteMapArray = new Array();
    db.sequelize.query(photoQuery, {
        replacements: queryParams
    }).spread(function(makeSiteMap) {

        //console.log(makeSiteMap);

        makeSiteMap.forEach(function(obj) {
            siteMapArray.push({
                url: '/photo/' + obj.img_id,
                changefreq: 'weekly',
                priority: 0.8,
                lastmodrealtime: true
            }, );
        });

        //console.log (siteMapArray);
    })
    return siteMapArray
}

var sitemap = sm.createSitemap({
    hostname: hostname,
    cacheTime: 600000, //600 sec (10 min) cache purge period 
    urls: [{
            url: '/',
            changefreq: 'weekly',
            priority: 0.8,
            lastmodrealtime: true,
            lastmodfile: 'views/home.hbs'
        },
        photoURLs()
    ]
});

这不起作用。一切返回的离子photoURL都会被忽略,但我不确定如何修改返回

修改

如果我在console.log({url: '/photo/' + obj.img_id, changefreq: 'weekly', priority: 0.8, lastmodrealtime: true },)命令之后直接放siteMapArray.push,我会得到如下输出,我认为这是我之后的事。

  { url: '/photo/354F5745AF',
    changefreq: 'weekly',
    priority: 0.8,
    lastmodrealtime: true },
  { url: '/photo/8CC02E33C0',
    changefreq: 'weekly',
    priority: 0.8,
    lastmodrealtime: true },
  { url: '/photo/ED243618FA',
    changefreq: 'weekly',
    priority: 0.8,
    lastmodrealtime: true },

1 个答案:

答案 0 :(得分:0)

我意识到我的问题是Promise没有解决,所以我已经重写了代码,如下所示。我确定它不是最好的代码,但它确实有用。 (关于标签的一点是新的)。

function createSiteMap(myURLs, tagURLs) {
    var sitemap = sm.createSitemap({
        hostname: hostname,
        cacheTime: 600000,  //600 sec (10 min) cache purge period 
        urls: myURLs
        });
    fs.writeFileSync("public/sitemap.xml", sitemap.toString());    
    process.exit();
}

function uniq(a) {
    var seen = {};
    return a.filter(function(item) {
        return seen.hasOwnProperty(item) ? false : (seen[item] = true);
    });
}

function getPhotos() {
    return new Promise(function(resolve, reject) {
        var siteMapArray = new Array()
        var tags = new Array()
        siteMapArray.push ({ url: '/' , changefreq: 'weekly', priority: 0.8, lastmodrealtime: true, lastmodfile: 'views/home.hbs' },)
        db.sequelize.query(photoQuery, {
            replacements: queryParams
        }).spread(function(makeSiteMap) {
            makeSiteMap.forEach(function(obj) {
                var siteLink = { url: '/photo/' + obj.img_id, changefreq: 'weekly', priority: 0.6, lastmodrealtime: true }
                siteMapArray.push(siteLink);
                obj.tags = obj.tags.split(',').map(function(e) {
                    return e.trim();
                });
                for (var tag in obj.tags) {
                    tags.push(obj.tags[tag])
                }
            });

            resolve (siteMapArray);

            var uniqueTags = uniq(tags);
            for (var tag in uniqueTags) {
                var siteLink = { url: '/search/' + uniqueTags[tag], changefreq: 'weekly', priority: 0.8, lastmodrealtime: true }
                siteMapArray.push (siteLink);
            }

            createSiteMap(siteMapArray);

        });
    });
};