在快递中添加slug到req params url

时间:2015-11-15 06:57:12

标签: node.js express mongoose slug

我正在使用the 'slug' npm library来提供字符串 - 短划线 - 清洁度。当我将console.log()作为一个字符串时,该库可以正常工作,并且它需要正确地存储到所有相关的控制器中。

但是,我无法弄清楚如何正确地实现slug()来格式化我的URL。我遇到的问题是产品名称可能是“Foo Bar Baz Quux”,但我似乎找不到slug()的正确实现,而不会破坏app.js路由和findOne查询之间的连接猫鼬。

app.js

app.get('/market/:product_name', marketController.getProduct);

controller.js

exports.getProduct = function(req, res, next) {

  var product_name = req.params.product_name;
  // var slugProduct = slug(product_name);

  Product.findOne({'name': product_name}, function(err, product) {
    if (err) return next(err);
    return res.send(product.data);
  });
}

1 个答案:

答案 0 :(得分:0)

也许您可以通过在设置“产品架构”时定义 slug 属性来“slugify”产品。如果将 mongoosemongoose-slug-generator 插件一起使用,我可以确认它有效,请参阅 link... 您可以按如下方式设置:

const mongoose = require('mongoose');
const { Schema } = mongoose;
const slug = require('mongoose-slug-generator');

// * mongoose slug generator options
const options = {
  separator: '-',
  lang: 'en',
  truncate: 120
};

// * Init mongoose slug generator plugin
mongoose.plugin(slug, options);

const ProductSchema = new Schema({
  name: {
    type: String,
    trim: true
  },
  slug: {
    type: String,
    slug: 'name', // genarating slug from multiple properties is allowed ['name', 'brand']
    unique: true
  },
  price: {
    type: Number,
    required: true
  },
  brand: {
    type: String,
    default: 'Apple'
  }
});

module.exports = mongoose.model('Product', ProductSchema);
exports.getProduct = function(req, res, next) {

  const { product_name } = req.params;

  Product.findOne({ slug: product_name }, function(err, product) {
    if (err) return next(err);

    if (!product) {
     return res.status(404).json({
       message: 'Product data not found.'
     );
    }

    res.status(200).send(product);
  });
}

app.get('/market/:product_name', marketController.getProduct)

// request

const response = await axios.get('/api/market/my-awesome-product')

// response.data

{
 "_id": "60fh4d37ac1a1c6f58d6a5f4",
 "name": "My Awesome Product",
 "slug": "my-awesome-product",
 "price": 85.9,
 "brand": "Apple"
}