javascript - 如何在express js中构建站点地图?

标签 javascript mongodb express sitemap

我正在尝试使用位于 https://www.npmjs.org/package/sitemap 的 sitemap.js 包

我可以在站点地图内推送网址。但我想根据从 mongodb 检索的数据添加 url。我知道如何创建网址来提供站点地图,但因为从 mongo 查找数据是一个回调,所以在获取 data 之前,会调用/sitemap.xml 的路由器,因此我无法向站点地图提供更多网址。

这是我的路线文件的快照

var colors = require('colors'); 
var mongoose = require('mongoose');
var express = require('express');
var router = express.Router();
var sm = require('sitemap');
var _ = require('underscore');

//these models are found in the /models folder
var Post = mongoose.model('Post');
var Comment = mongoose.model('Comment');


var trendSchema = mongoose.Schema({
    tName: String,
    tName_h: String,    
    region: String
  });

var Trend = mongoose.model('Trend', trendSchema);

// var Trend = mongoose.model('Trend'); 






console.log('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');




var tfind = function  (trends) {
    Trend.find(function (err, trends) {
        if (err) {
            console.log(err);
            return next(err);
        }

    console.log('trends =', trends);
        var plucked = _.pluck(trends, 'tName');

        // console.log('plucked  trends',plucked);

        // console.log(' sitemap urls   = ', sitemap.urls);
        // sitemap.urls.length = 0;
        // sitemap.urls.push({ url: '/page-10/', changefreq: 'daily', priority: 0.3 });

    });
}


tfind.done(function (text) {
        console.log(' text   = ', text );
});




var sitemap = sm.createSitemap ({
      hostname: 'http://example.com',
      cacheTime: 600000,        // 600 sec - cache purge period
      urls: [
        { url: '/page-1/',  changefreq: 'daily', priority: 0.3 },
        { url: '/page-2/',  changefreq: 'monthly',  priority: 0.7 },
        { url: '/page-3/' }     // changefreq: 'weekly',  priority: 0.5
      ]
    });

router.get('/sitemap.xml', function(req, res) {
  sitemap.toXML( function (xml) {
      res.header('Content-Type', 'application/xml');
      res.send( xml );
  });
});



sitemap.urls.push({ url: '/page-5/', changefreq: 'daily', priority: 0.3 });
sitemap.urls.push({ url: '/page-7/', changefreq: 'daily', priority: 0.3 });
// sitemap.urls.push({ url: '/page-9/', changefreq: 'daily', priority: 0.3 });

console.log(' app.js  sitemap.urls == ', sitemap.urls);

最佳答案

如果我正确理解您的问题,您希望在渲染 XML 文件以进行响应之前将从 MongoDB 获取的数据添加到站点地图中。

首先,Node.js 是异步的,MongoDB 驱动程序也是基于它的。因此,您的路由句柄应该在其中执行搜索,并且当 mongo 返回文档时,只有在您确定一切都已完成后,才发回响应。

注意:为了简洁起见,我不会在这里编写配置和错误处理程序。另外,始终将您的expressjs 配置放在顶部,就在模块导入的下方。

var mongoose = require('mongoose');
.
.
var app = express();

// YOUR CONFIG SHOULD ALWAYS BE ON TOP

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
.
.

// YOUR CODE WAS MISSING A MONGODB CONNECTION SETUP
mongoose.connect('mongodb://localhost:27017/news', function () {
  console.log('Database Connected');
});

var sitemap = sm.createSitemap ({
  hostname: 'http://example.com',
  cacheTime: 600000,        // 600 sec - cache purge period
  urls: [
    { url: '/page-1/',  changefreq: 'daily', priority: 0.3 },
    { url: '/page-2/',  changefreq: 'monthly',  priority: 0.7 },
    { url: '/page-3/' }     // changefreq: 'weekly',  priority: 0.5
  ]
});

var trendSchema = mongoose.Schema({
  tName: String,
  tName_h: String,    
  region: String
});

var Trend = mongoose.model('Trend', trendSchema);

app.get('/sitemap.xml', function(req, res) {
  Trend.find(function (err, trends) {
    if (err) {
      console.log(err);
      return next(err);
    }
    trends.forEach(function(trend, index) {

      // Place your data extraction/insertion logic here
      sitemap.urls.push({ url: trend.tName, changefreq: 'daily', priority: 0.3 });

      if(index == trends.length-1) {
        sitemap.toXML( function (xml) {
          res.header('Content-Type', 'application/xml');
          res.send( xml );
        });
      }
    });
  });
});

var server = app.listen(3000, function() {
  console.log('Express server listening on port ' + server.address().port);
});

关于javascript - 如何在express js中构建站点地图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27162617/

相关文章:

JavaScript 文件依赖于 Yii2 中的 JavaScript 代码块(用于 dojo 配置)

node.js - 返回不在模型中的字段

javascript - 如何从 expressjs 的响应中捕获前端错误?

apache - 避免nodejs和apache的80端口冲突

javascript - 如何修复 WordPress 中的 "undefined is not a function"

javascript - 使用 Blob 特定的 SAS token 连接和更新 Azure Blob

javascript - 模糊逻辑重复名称检测器

mongodb - Mongoose 填充不返回任何结果

mongodb - 如何找出 mongodb 崩溃的原因?

node.js - 在 res.send 期间更改了 JS 对象