我正在尝试使用位于https://www.npmjs.org/package/sitemap的sitemap.js包
我可以在站点地图中推送urls。但是我想根据我从mongodb检索到的数据来添加url。我知道如何创建url来提供站点地图,但因为从mongo中查找数据是一个回调,在我获得数据之前,/sitemap.xml的路由器被调用,所以我无法向站点地图提供更多的url。
这是我的路径文件的快照
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);发布于 2014-11-27 12:26:39
如果我正确理解您的问题,您希望在呈现响应的MongoDB文件之前将从XML获取的数据添加到您的站点地图中。
首先,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);
});https://stackoverflow.com/questions/27162617
复制相似问题